Последний тюнинг известной обработки 1CQA (консоль прямых запросов 1С++) для 1С:Предприятие-77.
Разработка - Инструментарий разработчика
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
| Наименование | Скачано | Купить файл | По подписке PRO |
|---|---|---|---|
|
Консоль1CQA_ALL.rar
.rar 2,23Mb
352
|
352 | 2 500 руб. Купить | 1 SM Скачать |
|
Консоль1CQA.rar
.rar 49,29Kb
23
|
23 | 2 500 руб. Купить | 1 SM Скачать |
|
FormEx1CPP.rar
.rar 2,12Mb
22
|
22 | 2 500 руб. Купить | 1 SM Скачать |
|
PlugIns.rar
.rar 62,94Kb
17
|
17 | 2 500 руб. Купить | 1 SM Скачать |
|
Samples.rar
.rar 3,86Kb
20
|
20 | 2 500 руб. Купить | 1 SM Скачать |
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Свет мой, 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) Другие улучшения (их множество, смотрите подробности в описании в самой обработке). Вот некоторые из них:
- При клике по пустой таблице параметров запроса выводится диалог с информацией о работе с параметрами запроса (Рис.5);
- Выбор типа объекта производится в удобном красивом диалоге в виде дерева (Рис.6);
- При клике по таблице результатов запроса, если значение в ячейке ссылочного типа, выводится меню действий с объектом (Рис.11). Меню позволяет:
открыть объект для просмотра-редактирования;
открыть объект в списке (журнале);
пометить его на удаление;
снять пометку;
удалить непосредственно;
открыть объект для редактирования в обработке 'Редактор Реквизитов' (автор Цылёв Владислав vet7777@mail.ru);
- Для документов доступны дополнительные действия:
провести;
отменить проведение;
изменить дату-время (для этого действия требуется обработка ИзменениеВремениДокумента);
- Кроме этого для документа можно вывести отчет о движениях или сформировать структуру подчинености. Соответствующие отчеты интегрированы в консоль (чтобы не зависеть от используемой конфигурации):
Отчет о движениях - в полном вариате (по регистрам, проводкам, записям ЖР и истории реквизитов).
При формировании структуры подчиненности для выборки подчиненых документов используются прямые запросы к базе.
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"
.
Основные направления для использования:
1) Для разработчиков: проверка запросов, изучение вопроса о том где, как и какие данные хранятся в базе данных.
2) Администрирование данных: исправление ошибок в ИБ в дополнение к процедуре тестирования-исправления. В больших рабочих базах тестирование-исправление выполнить нереально. У меня оно длилось, например, больше двух суток. Поэтому тестирование запускается на копии базы в пакетном режиме с записью лога. Затем по информации из лога в 1CQA запросом SELECT вытаскиваем некорректные записи из базы. После анализа этих записей принимается решение:
- исправляем запросом UPDATE ,
- удаляем запросом DELETE,
- помечаем на удаление, чтобы потом удалить с контролем ссылочной целостности (пометить можно тоже в 1CQA запросом UPDATE).
3) Реорганизация данных при обновлениях: установка новых реквизитов, ресурсов и измерений в таблицах объектов метаданных, например регистров. В архиве Samples.rar из файлов поставки в файле Sample_TransforRegister_SQL.qry находится пример реально использованного скрипта для довольно сложной установки новых измерений и реквизитов регистра. Фактически скрипт заменяет перепроведение по регистру (выборочно, без пересчета итогов). Итоги также можно пересчитать прямыми запросами с помощью обработок (только базы SQL):
ПересчетИтоговРегистров.ert или 1CУстановкаТА.ert.
Благодарности:
Кроме авторов обработки хотелось бы также поблагодарить всех разработчиков 1CPP и FormEx. Без их самоотверженного труда 1С-ка была тормозна, скучна, безлика и беспросветна!
Вступайте в нашу телеграмм-группу Инфостарт
См. также
Инструментарий разработчика Системный администратор Разработчик 1С:Предприятие 7.7 1C77 Абонемент ($m)
Консоль запросов к базе SQL, не требующая внешних компонент
10 стартмани
29.04.2015 25457 60 Gvozdod 8
Инструментарий разработчика Системный администратор Разработчик 1С:Предприятие 7.7 Оперативный учет 7.7 Бухгалтерский учет 7.7 Расчет 7.7 1C77 Россия Бесплатно (free)
Обновленная сборка OpenConf Light Pack.
27.04.2014 63508 501 unichkin 51
Инструментарий разработчика Системный администратор Разработчик 1С:Предприятие 7.7 1С:Предприятие 8 Абонемент ($m)
Очередная редакция альтернативного стартера, являющегося продолжением StartManager 1.3. Спасибо всем, кто присылал свои замечания и пожелания, и тем, кто перечислял финансы на поддержку проекта. С учетом накопленного опыта, стартер был достаточно сильно переработан в плане архитектуры. В основном сделан упор на масштабируемость, для способности программы быстро адаптироваться к расширению предъявляемых требований (т.к. довольно часто просят добавить ту или иную хотелку). Было пересмотрено внешнее оформление, переработан существующий и добавлен новый функционал. В общем можно сказать, что стартер эволюционировал, по сравнению с предыдущей редакцией. Однако пока не всё реализовано, что планировалось, поэтому еще есть куда развиваться в плане функциональности.
1 стартмани
23.04.2014 193661 1923 Alexoniq 1677
Инструментарий разработчика Разработчик 1С:Предприятие 7.7 1С:Предприятие 8 Россия Абонемент ($m)
Согласитесь, что окно стандартное сообщений в 1С иногда приносит больше неудобств, чем пользы. И тем более разные "Предупредить"... Что с этим окном только не делают! Его отцепают от формы, делают маленьким, умудряются спрятать за границы экрана. А потом звонят программистам с претензией, что документ почему-то не проводится, отя ничего и не пишет. У вас такого не было? А вот у нас было и не раз )))
1 стартмани
04.09.2013 36734 61 O-Planet 78
Инструментарий разработчика Разработчик 1С:Предприятие 7.7 1C77 Абонемент ($m)
На днях встретил вопрос на форуме про возможность внесения изменений в конфигурацию без долгого сохранения в рабочей базе большого объема. Вот решил поделиться опытом, как это делал я. База у нас была объемом порядка 120 Гб. К базе обращался сайт в режиме 24/7, поэтому важно было быстро сохранять изменения и желательно без последующего монопольного запуска для восстановления индексов и процедур и без отключения пользователей от базы. Это первая часть статьи и посвящена она справочникам. С одной стороны - это самый простой объект, с другой стороны, именно про справочник спрашивалось на форуме. Если статья будет востребована, то я напишу аналогичные про документы, регистры и может еще что.
1 стартмани
13.08.2013 25114 Reptile 5
Инструментарий разработчика Разработчик 1С:Предприятие 7.7 1C77 Абонемент ($m)
Встала недавно задача для одной организации, которая все еще на 1С 7.7 немного автоматизировать работу отдела продаж. А именно уйти от ручного заполнения договоров, сделанных юристами в MS Word. Договора от разных фирм и разного назначения отличались. Переводить их в таблицы 1С очень не хотелось и нашел способ прямо в файлах Word сделать небольшие дополнения, чтобы можно было печатать, используя именно эти заготовки юристов.
1 стартмани
14.07.2013 30209 57 adamx 11
Инструментарий разработчика Разработчик 1С:Предприятие 7.7 1C77 Абонемент ($m)
Давным давно, когда я еще плотно писал на 7.7 работа с формами была мучительной и неудобной. Приходилось каждый элемент выкладывать, выравнивать на форме ручками, прописывать код в модуле. Иногда при разработке очередной формы приходила в голову мысль: "а где-то я уже похожее делал..." и начинался мучительный поиск подходящего кода в своих запасах........
1 стартмани
21.02.2013 21121 36 MarSeN 14
Инструментарий разработчика Разработчик 1С:Предприятие 7.7 1C77 Абонемент ($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 38930 51 venger 7
Ivan T Berezdetsky (berezdetsky@yahoo.com). В предлагаемой версии:
1) Добавлена возможность выбирать тип провайдера данных ODBC или OLEDB (только базы DBF);
2) Добавлена возможность редактировать текст запроса в диалоге конструктора запросов, предоставляемого объектом "AddIn.qryConsole" ВК qryConsole.dll (только базы SQL);
3) Расширен список типов объектов, которые могут принимать параметры запроса;
4)Добавлена возможность через параметры запроса укладывать списки ссылок объектов во временные таблицы (в том числе с иерархическим включением). Эти таблицы можно использовать в тексте запроса по имени ‘#<ИмяПараметра>’;
5) Добавлена возможность открывать обработку в режиме подбора (или имитации подбора) из других форм для подбора произвольных выборок данных из базы;
6) Сделано множество других улучшений (интерфейсных и пр.);
Если обработка скажет что-то странное насчет ваших прав - значит вы себя обидели! ;))))
Поскольку обработка не для шаловливых ручек,
при открытии там сразу написано:
ПравоЕсть=1;
ПравоЕсть=ПравоЕсть
*ПравоДоступа("УдалениеПомеченныхОбъектов")
*ПравоДоступа("ПоискСсылокНаОбъекты")
*ПравоДоступа("ИспользованиеЛюбыхВнешнихОтчетов")
*ПравоДоступа("ГрупповоеПроведениеДокументов")
*ПравоДоступа("УправлениеБухгалтерскимиИтогами")
*ПравоДоступа("УправлениеОперативнымиИтогами")
*ПравоДоступа("МонопольныйРежим")
*ПравоДоступа("СохранениеИВыгрузкаДанных")
*ПравоДоступа("АдминистративныеФункции"); // по совокупности крутых прав
Если (ПравоЕсть=0) Тогда
Предупреждение("Недостаточно круты права доступа !!!",60);
СтатусВозврата(0);
Возврат;
КонецЕсли;
Народ!!!
Если обработка скажет что-то странное насчет ваших прав - значит вы себя обидели! ;))))
Поскольку обработка не для шаловливых ручек,
при открытии там сразу написано:
ПравоЕсть=1;
ПравоЕсть=ПравоЕсть
*ПравоДоступа("УдалениеПомеченныхОбъектов")
*ПравоДоступа("ПоискСсылокНаОбъекты")
*ПравоДоступа("ИспользованиеЛюбыхВнешнихОтчетов")
*ПравоДоступа("ГрупповоеПроведениеДокументов")
*ПравоДоступа("УправлениеБухгалтерскимиИтогами")
*ПравоДоступа("УправлениеОперативнымиИтогами")
*ПравоДоступа("МонопольныйРежим")
*ПравоДоступа("СохранениеИВыгрузкаДанных")
*ПравоДоступа("АдминистративныеФункции"); // по совокупности крутых прав
Если (ПравоЕсть=0) Тогда
Предупреждение("Недостаточно круты права доступа !!!",60);
СтатусВозврата;
Возврат;
КонецЕсли;
вдруг какой продвинутый юзвер (знаю я таких) додумается написать:
truncate table _1sjourn
:)))))))
yuraos
Просто если много наработанного кода под "семерку", его трудно сразу вот так взять и перенести на "восьмерку". Поэтому и сидим на "семерке" и пилим ее дальше под себя.
Етта точно!
Сидим на этом суку и пилим-пилим-пилим его .... ;))))))
Че дальше бывает по закону гравитации наверное все знают.
Консоль1CQA_ALL.rar
Консоль1CQA.rar
PlugIns.rar
Подправлен мелкий баг в консоли при "перезагрузке запроса" +
+ некритические изменения во вспомогательной обработке ИзменениеВремениДокумента.ert.
большая организация => очень большие запросы\хотелки узеров => очень очень много дописок, и перенос ни к чему если все работает на 7
"sel ect id as Ссылка from $Справочник.Номенклатура INTO TABLE #Номенклатура)"+
CHR(13)+
"select Таб.Ссылка as [Ссылка$Справочник.Номенклатура] fr om #Номенклатура as Таб")
не работает у меня говорит нет dbf номенклатура
чтобы вычислить дату оплаты кредит-документа:
NVL($КДок1.ДатаОплаты,NVL($КДок2.ДатаОплаты,NVL($КДок3.ДатаОплаты,NVL($КДок4.ДатаОплаты,NVL($КДок5.ДатаОплаты,{d’0001-01-01’}))))) as ДатаОплаты
---
теперь как я понимаю твоя задача все это разломать,
а потом правильно собрать соединив CHR(13)
;)
во вложении - исходник запроса для консоли
// Знак "'" не поддерживается, поэтому заменяем на скобки
Скобка="[";
номпозиции=Найти(ТекстЗапроса,"'");
Пока номпозиции<>0 Цикл
ТекстЗапроса=Лев(ТекстЗапроса,номпозиции-1)+Скобка+Сред(ТекстЗапроса,номпозиции+1);
Если Скобка="[" Тогда Скобка="]"
Иначе Скобка="["
КонецЕсли;
номпозиции=Найти(ТекстЗапроса,"'");
КонецЦикла;
// Знак """ не поддерживается, поэтому заменяем на скобки
Скобка="[";
номпозиции=Найти(ТекстЗапроса,"""");
Пока номпозиции<>0 Цикл
ТекстЗапроса=Лев(ТекстЗапроса,номпозиции-1)+Скобка+Сред(ТекстЗапроса,номпозиции+1);
Если Скобка="[" Тогда Скобка="]"
Иначе Скобка="["
КонецЕсли;
номпозиции=Найти(ТекстЗапроса,"""");
КонецЦикла;
//Разделитель строк не поддерживается поэтому убираем,
//строки больше 255 симолов не поддерживаются , поэтому удлиняем при помощи CHR(13)
ВрТекстЗапроса="";
Для Счетчик=1 По СтрКоличествоСтрок(ТекстЗапроса) Цикл
ТекСтрока=СтрПолучитьСтроку(ТекстЗапроса,Счетчик);
ТекСтрока=" "+СокрЛП(ТекСтрока)+" ";
Если Счетчик=1 Тогда
ВрТекстЗапроса=ВрТекстЗапроса+ТекСтрока;
Иначе
Если СокрЛП(ТекСтрока)<>"" Тогда
ПереносСтрокиФоксПро="'+"+CHR(13)+"'";
ВрТекстЗапроса=ВрТекстЗапроса+ПереносСтрокиФоксПро+ТекСтрока
КонецЕсли;
КонецЕсли;
КонецЦикла;
ТекстЗапроса = ВрТекстЗапроса;
ВрТекстЗапроса = "";
номпозиции=Найти(ТекстЗапроса,"{d"); // {d [2006-01-01]}
Пока номпозиции<>0 Цикл
Начало=Лев(ТекстЗапроса,номпозиции-1);
ДатаПар=Сред(ТекстЗапроса,номпозиции+4,10);
Конец=Сред(ТекстЗапроса,номпозиции+16);
ТекстЗапроса=Начало+"{^ "+ДатаПар+"}"+Конец;
номпозиции=Найти(ТекстЗапроса,"{d");
КонецЦикла;
ТекстЗапроса = "EXECSCRIPT(' SEL ECT * fr om ("+текстзапроса+") as WW INTO table TempTmpTable1') ";
в принципе я так и понял,
что ты программно генеришь текст запроса с функцией EXECSCRIPT()
на основе исходного.
но с учетом замечания в (173) я подумал, что проблема связана
с непроверенным изменением запроса для учета дат оплат возвратов.
мутная эта вся тема с функцией EXECSCRIPT()
...
то нельзя, это не поддерживается.
одно лишь преимущество -
- можно пакет команд выполнить за одно обращение к провайдеру данных.
но при этом текст запроса приходится нетривиально преобразовывать.
...
я бы попытался обойтись без нее
если "чтобы отображалось по нормальному" - то никак
если не использовать 1с-ную типизацию в алиясе поля
вместо
СпрФир.ID as [Фирма$Справочник.Фирмы]
писать просто
СпрФир.ID as Фирма
то имя поля транслироваться будет "нормально",
но при выгрузке результата запроса в тз
будут отображаться сами id-ники, а не наименования
вот так через ICASE:
ICASE(NOT ISNULL($КДок1.ДатаОплаты),$КДок1.ДатаОплаты,NOT ISNULL($КДок2.ДатаОплаты),$КДок2.ДатаОплаты,NOT ISNULL($КДок3.ДатаОплаты),$КДок3.ДатаОплаты,NOT ISNULL($КДок4.ДатаОплаты),$КДок4.ДатаОплаты,NOT ISNULL($КДок5.ДатаОплаты),$КДок5.ДатаОплаты,DATE(100,1,1)) as ДатаОплаты
да, в самом последнем запросе (по вложенности или в пакете),
результат которого выгружается в ТЗ,
в алиясе полей агрегатных типов надо указывать 1с-ную
типизацию вроде as [Фирма$Справочник.Фирмы]
--
только имей ввиду,
если каким-то образом вытащишь id-ники из чужой базы
то результат типизации может быть непредсказуем и заведомо неправильным.
результат типизации может быть непредсказуем и скорее всего неправильным.
поясняю на примере:
Есть база АА и база ББ.
И там и там есть справочник Контрагенты.
Id-ники грубо говоря это числа
уникальные в пределах одной таблицы и
возрастающие в порядке ввода элементов.
Пусть в базе АА контрагентов добавляли в следующем порядке:
К1(1), К2(2) - в скобках условно значение Id
А в базе ББ пусть в начало вклинился контрагент К3:
К3(1), К1(2), К2(3)
И так что имеем при типизации данных выдернутых из базы ББ,
но типизируемых в базе АА:
Контрагент К3(1) соотнесется с контрагентом К1(1)
К1(2) - с К2(2)
а контрагент К2(3) - не соотнесется ни с чем (скорее всего результатом типизации будет битая ссылка)
Еще более криво получится при группировке объединенных данных по id-никам:
В описанной выше ситуации
данные контрагента К1(1) из базы АА сложатся с данными контрагента К3(1) из базы ББ
- это уже будет искажением числовых учетных данных
наименьшим злом в этой ситуации было бы
выбирать в конечной выборки для группировки
не id-ники а строковые представления.
для справочников - это наименования (ну может в редком случае код)
а для кредит-документов
....
опа - тут мы с тобой и попались
;)
1. Ну дай бог, если базы связаны УРБД и все справочники заполняются в центральной базе
и при переносе в перефирийных базах добавляются в том же порядке, что в центральной.
:)
2. не путай ссылку как "объект" или значение "агрегатного типа".
с идентификатором ссылки,
которую часто тоже по простому обзывают "ссылкой".
через объект через точку действительно вытаскиваются остальные атрибуты.
ну а в запросах все атрибуты приходится тянуть из полей соответствующих таблиц
явно или неявно (как в 8-ке при разименовывании поля Ссылка).
как я понял ты имел ввиду, что
в восьмерке можно писать запросы вроде этого:
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК Документ,
РеализацияТоваровУслуг.Контрагент,
РеализацияТоваровУслуг.Контрагент.Код,
РеализацияТоваровУслуг.Контрагент.Наименование,
РеализацияТоваровУслуг.Контрагент.ИНН,
РеализацияТоваровУслуг.Контрагент.КПП
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
хочу отметить, что в восьмерке язык запросов - это довольно высокоуровневая штука.
в нем имеются высокуровневые расширения.
То что мы сейчас обсуждаем (получение подчиненных полей через точку)
называется "разыменованием поля" - как раз является одним из таких расширений.
при этом на более низком уровне движок запроса выполняет запрос
несколько с другим текстом:
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК Документ,
РеализацияТоваровУслуг.Контрагент,
Контрагенты.Код КАК КонтрагентКод,
Контрагенты.Наименование КАК КонтрагентНаименование,
Контрагенты.ИНН КАК КонтрагентИНН,
Контрагенты.КПП КАК КонтрагентКПП
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО РеализацияТоваровУслуг.Контрагент = Контрагенты.Ссылка
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &ДатаНач И &ДатаКон
то есть получение подчиненных полей неявно сводится к использованию
дополнительных левых соединений и подчиненные поля выбираются
из таблиц с правой стороны этих соединений.
Ну а то с чем ты связался - прямые запросы 1cpp в 1с-7.7
да еще в dbf-ной базе
ЭТО ЕСТЬ ТОТ САМЫЙ НАИНИЗКОУРОВНЕВЫЙ SQL-ЯЗЫК
там даже виртуальных таблицы
метапарсером почему-то не поддерживются
(вернее криво парсятся),
приходится их самому изображать
так-что придется тебе привыкать писать запросы так,
как они примерно на самом деле делаются
:)
Этой "издёвке" года 4 уже.
И читай дальше, что пишут на сайте:
icpp/3.x (рекомендуется к использованию)
В начале 2008 года проект 1C++ портирован с MSVS 6.0 на MSVS 2005(2008) / Intel Compiler (IСL) / STLPort / Boost 1.35.0
Дальнейшее развитие идет под именем icpp (версии 3.x.x.x)
+ А строка для оледб у тебя не верная (точнее, устаревшая)
Млин, ЁПРСТ, ты чувак умный, авторитетный!
Не поделися с обчеством умом-размом?
Народ с открытым ртом смотрит на тебя... ;))))))))
>>>"рекомендованные стабильные релизы".
Этой "издёвке" года 4 уже.
И читай дальше, что пишут на сайте:
icpp/3.x (рекомендуется к использованию)
В начале 2008 года проект 1C++ портирован с MSVS 6.0 на MSVS 2005 / Intel Compiler (IСL) / STLPort / Boost 1.35.0
Дальнейшее развитие идет под именем icpp (версии 3.x.x.x)
----
Пардонс ... не думал что это "для лохов".
Учтемс что разработчики иногда шутятс :))))))))))))))))))
Обновлены файлы поставки:
Консоль1CQA.rar, Консоль1CQA_ALL.rar, и PlugIns.rar .
-------------------------------------------------------------------------------------
1) Для устранения "навязчивого сервиса" добавлен флаг 'ДП' над кнопкой "Выполнить" (по умолчанию сброшен).
Если флаг установлен - выводится меню дополнительных действий.
Если не установлен - просто выполняется запрос.
2) Для баз DBF добалена возможность выбирать значение параметра 'Collate' / 'Collating'
через меню действий, выводимого по кнопке "Выполнить" (.
4) В сервисной обработке устранен мелкий баг.
5) По замечаниям господина ЁПРСТ в архив FormEx1CPP.rar
добавлены последние версии ВК 1cpp.dll.
-------------------------------------------------------------------------------------
Всем спасибо за внимание!
Обновлены файлы поставки Консоль1CQA_ALL.rar и Консоль1CQA.rar.
Отчеты "Движения документа" и "Структура подчиненности"
(используются при обработке выбора из меню действий с объектом в таблице результатов запроса)
интегрированы в консоль, чтобы не зависеть от используемой конфигурации.
Отчет о движениях - в полном вариате (по регистрам, проводкам, записям ЖР и истории реквизитов).
При формировании структуры подчиненности для выборки подчиненых документов используются прямые запросы к базе.
Также оптимизировано поведение консоли для баз DBF в монопольном режиме:
При открытии обработка в блоке попытка-исключение пытается выполнить тестовый запрос:
select count(*) from 1susers.
Если при выполнении запроса исключения не возникает -
- значит в монопольном режиме прямые запросы работают (пользователь подсуетился для этого).
И поэтому ему не надо выводить никаких сообщений "о невозможности выполнить запрос".
елы-палы.. как-то у меня консоль запросов от Ivan T Berezdetsky весьма существенно отличается от сабжевой... а консоль - достаточно свежая, еще по моей проьбе Ivan T Berezdetsky вносил/попралвл допфункционал...
Сначала мне по наследству досталась, повидимому, первоначальная версия
консольки от Дмитрия Ощепкова.
Я ее довольно сильно натюнил:
прикрутил режим подбора (нада было),
конструктор запросов (для развлекухи, но иногда полезен),
укладывание списков ссылок во впеменные таблицы (бывает полезно),
ну и всяких бантиков навязал интерфейсных (вроде ).
При этом я старался сильно не "ломать" диалог и модуль.
Но недавно мне попалась вот эта версия консоли
И мне сильно захотелось имитацию исполнения пакетного запроса
(эта фича меня щас здорово выручает, ломаю регистры перед обрезкой базы неподетски!).
Что бы объединить функционал двух версий обработок,
пришлось все довольно сильно все переделать (и диалоге, и в модуле).
Так что эта консоль довольно сильно отличается от исходных.
Но авторская информация в описании оставлена без изменений + добавлено от себя.
Нах мне 8ка если все инструменты для работы есть в семерке?
77+ООП = не надо мучать попу 8кой
ты имеешь наверное ввиду этот проект
???
ну будем надеяться,
что только расширением возможностей конфигуратора дело не закончиться
:)))))))))))
Эх, как я буду в 8-ке без своих любимых индексированных таблиц !!!
ТаблицаЗначений (ValueTable)
Индекс (IndexOf)
Синтаксис:
Индекс(<Строка>)
Параметры:
<Строка> (обязательный)
Тип: СтрокаТаблицыЗначений. Строка таблицы значений, для которой нужно определить индекс.
Возвращаемое значение:
Тип: Число. Индекс указанной строки в коллекции. Если не найдено, то возвращается -1.
Описание:
Получает индекс строки в коллекции строк таблицы значений.
тебе стандартных средств работы с индексами в восьмерке не хватает?
ТаблицаЗначений (ValueTable)
Индекс (IndexOf)
Синтаксис:
Индекс(<Строка>)
Параметры:
<Строка> (обязательный)
Тип: СтрокаТаблицыЗначений. Строка таблицы значений, для которой нужно определить индекс.
Возвращаемое значение:
Тип: Число. Индекс указанной строки в коллекции. Если не найдено, то возвращается -1.
Описание:
Получает индекс строки в коллекции строк таблицы значений.
fishca, ты наверное хотел не про эти индексы ;)))
а про вот эти (иначе - совсем не в тему попал):
1) ТаблицаЗначений (ValueTable)
Индексы (Indexes)
Использование:
Только чтение.
Описание:
Тип: ИндексыКоллекции.
Содержит коллекцию индексов таблицы значений.
2) ИндексыКоллекции (CollectionIndexes)
Добавить (Add)
Синтаксис:
Добавить(<Колонки>)
Параметры:
<Колонки> (обязательный)
Тип: Строка.
Строковое описание колонок индекса в виде: "Колонка1, Колонка2...".
Возвращаемое значение:
Тип: ИндексКоллекции.
Описание:
Добавляет индекс в список индексов коллекции.
Показатьи с 1cpp наверняка не работал...
... индексированная таблица там не просто таблица значений с индексами
для ускорения перебора строк, а нечто большее, вот почитай справку он-лайн:
fishca,
ты имеешь наверное ввиду этот проект
???
ну будем надеяться,
что только расширением возможностей конфигуратора дело не закончиться
:)))))))))))
Эх, как я буду в 8-ке без своих любимых индексированных таблиц !!!
Кстати всем рекомендую!
Вот здесь можно скачать бесплатную демо-версию:
Обновлены файлы поставки:
- Консоль1CQA_ALL.rar
- Консоль1CQA.rar
- FormEx1CPP.rar
Текущие изменения:
1) Добавлена обработка спец.комментариев в тексте запроса (для установки спец.опций выполнения запроса).
поддерживается обработка следующих спец.комментариев:
'--!ExecuteTransaction' выполнять в транзакции с фиксацией или откатом (в зависимости от ошибок);
'--!ExecuteRollback' выполнять в транзакции с последущим откатом
(для просмотра "результатов" запроса без изменения данных в базе);
подробности в макете "СпецКомметарииЗапроса" (можно вывести в табличный документ из диалога обработки).
2) Добавлен вывод в табличный документ описания обработки;
3) В меню действий с объектом по клику мышью добавлена
команда открытия объекта для редактирования в обработке
;
4) В файле FormEx1CPP.rar выложена подправленная версия класса "Общие.Форма.Привязка"
(устранена ошибка времени выполнения, проявляющаяся в терминале,
если установлен размер окна приложения в 'процентах от размера рабочего стола'
большое спасибо за обсуждение проблемы);
Обновлены файлы поставки:
- Консоль1CQA_ALL.rar
- Консоль1CQA.rar
Текущие изменения:
1) Исправлен баг: не выводилось описание обработки (из-за неправильного указания имени макета с описанием).
2) Исправлен баг: не формировалось дерево документов при обработке команды меню действий со значением в ячейке таблицы результатов запроса (из-за неправильного вызова процедуры рекурсивного вывода на печать подчиненных документов).
Довольно таки хорошая штука)))
народ, подскажите, может быть есть что либо в 7.7 для прямых запросов, похожее на 8шный конструктор запросов?
Есть штатный убогий инструмент, для таких же штатных убогих запросов.
;))))
Есть так же примочки для запросов 1c++:
Вот эта примочка для режима конфигуратора:
Примочка для режима 1с-преприятие описана в этой статье и использавана в использавана данной консоли.
ЗЫ:
правда примочки эти работают только для баз SQL
:((((((((((
Кажется, мне где-то попадался пример такого запроса, но через консоль не вижу как это сделать.
.... но запрос придется полностью писать самому,
используя таблицы:
1SACCS (счета)
1SBKTTLC (итоги синтетические)
1SBKTTL (итоги аналитические по субконто)
1SENTRY (бухг. проводки) в соединении с таблицей 1SJOURN
К сожалению разработчики 1с++, наверное,
не были сильно озадачены решением бухгалтерских задач и
не предусмотрели для бухитогов виртуальных таблиц.
Впрочем в dbf версии все имеющие виртульные таблицы не работают и
даже запрос к остаткам по регистру приходится писать руками.
Здесь кое-какая описаловка по структуре таблиц 1С:
Здесь кое-какие примеры по запросам к бухитогам:
Примеры чисто ознакомительные. Все нужно на самом деле анализировать и писать с нуля.
Во вложении - парсер файлов DD / DDS.
Наглядно показывает структуру всех таблиц базы, имена и типы полей.
Часто бывает полезен:
Я например ни за что бы не догодался, что остатки и обороты в таблицах
1SBKTTLC и 1SBKTTL (версия для dbf) хранятся в полях с типом char(15),
а в sql версии используется более "естественный" тип numeric(15.2)!
Успехов вам!!!
:)
:)
если вы работаете в базе dbf
вам также будет полезна справка по
Microsoft Visual FoxPro 9.0.
если в базе sql то справка в
SQL Server Books Online
В прямых запросах часто приходися использовать встроенные функции,
в частности функции пребразования типов.
Для запросов к бухитогам можно использовать класс ПрямойЗапрос, автор vandalsvq
Что он может:
- выполнение запроса на языке подобном 1Cv8
- выполнение запроса независимо от формата БД (DBF - 1sqlite, SQL - ODBCRecordset)
- наличие виртуальных таблиц, вроде Остатки, Обороты и ОстаткиОбороты по БухИтогам и Регистрам
Релиз:
Обсуждение:
Простой пример использования: Отображение остатков по товарам в форме списка справочника Номенклатура
//__________________________________________________________
Процедура ОбновитьОстатки() //[+]sv 031112
//[!]sv 031112 Прямой запрос отрабатывает очень быстро, можно даже повесить динамическое обновление остатков на обработку ожидания
тзОстатки = СоздатьОбъект("ТаблицаЗначений");
флПрямойЗапрос = 1;
флПоказатьОстатки = 0;
т1 = _GetPerformanceCounter();
КонДата = КонецРассчитанногоПериодаБИ();
стрПредставлениеПериодаЗапроса = Строка(КонДата);
спСчетов = СоздатьОбъект("СписокЗначений");
спСчетов.ДобавитьЗначение(СчетПоКоду("214.1"));
спСчетов.ДобавитьЗначение(СчетПоКоду("214.2"));
спСчетов.ДобавитьЗначение(СчетПоКоду("214.3"));
стрСчета = СтрЗаменить(спСчетов.ВСтрокуСРазделителями(), """", "");
стрСчета = СтрЗаменить(стрСчета, ",", ", ");
мдв = СоздатьОбъект("MetaDataWork");
ЗапросСчет = "";
Для иС = 1 По спСчетов.РазмерСписка() Цикл
ЗапросСчет = ЗапросСчет + мдв.ЗначениеВСтрокуБД(спСчетов.ПолучитьЗначение(иС)) + ?(иС = спСчетов.РазмерСписка(),"","','");
КонецЦикла;
Состояние("Расчет итогов на "+стрПредставлениеПериодаЗапроса+" сч. "+стрСчета);
//Запрос
ПрямойЗапрос = СоздатьОбъект("ПрямойЗапрос");
//ПрямойЗапрос.РежимОтладки = 1;
ПрямойЗапрос.УстановитьТекстовыйПараметр("КонДата", КонДата);
ПрямойЗапрос.УстановитьТекстовыйПараметр("ЗапросСчет", ЗапросСчет);
ТекстЗапроса = "
|ВЫБРАТЬ
| Субконто1 КАК [Субконто $Субконто]
|, Субконто1_вид КАК Субконто_вид
|, СУММА(КоличествоОстаток) КАК [Количество $Число.15.3]
|ИЗ
| $БИОстатки.Основной(:КонДата~
| ,
| ,(Номенклатура)
| ,(Количество)
| ,(Счет В (:ЗапросСчет))
| ,
| ) КАК Би
|
|СГРУППИРОВАТЬ
| Субконто1, Субконто1_вид
|";
тзОстатки = ПрямойЗапрос.Выполнить("ТаблицаЗначений",ТекстЗапроса);
ПрямойЗапрос = "";
ВремяЗапроса = _GetPerformanceCounter()-т0;
Сообщить("Время запроса: "+ВремяЗапроса);
Если тзОстатки.КоличествоКолонок() <> 0 Тогда
флПоказатьОстатки = 1;
КонецЕсли;
КонецПроцедуры
//__________________________________________________________
Функция Остаток() //[+]sv 031112
_Остаток = 0;
Если флПоказатьОстатки = 1 Тогда
нстр = 0;
Если тзОстатки.НайтиЗначение(ТекущийЭлемент(), нстр, "Субконто") = 1 Тогда
_Остаток = тзОстатки.ПолучитьЗначение(нстр, "Количество");
КонецЕсли;
КонецЕсли;
Возврат _Остаток;
КонецФункции
да я все время присматриваюсь к этому классу
...
все думаю заточить эту консоль под 1sqlite
и добавить подобие конструктора заготовок для запросов
но руки не доходят (поскольку я сейчас отошел от 1с-7.7)
---
но если руки дойдут - то заодно заточу ее и под этот класс.
;)
Ну нет, так нет - будем писать вручную.
Правда мне как-то привычнее в таком виде:
SELECT
СубконтоДт2 [ТМЦ $Справочник.ТМЦ]
, Сумма
, Количество
FROM $БИДвиженияССубконто.Основной(:НачДата,:КонДата~,,
(СчетДт = :СчетДт) and (СубконтоДт1 =:ВыбМестоХранения)) БИ
хотя привычнее, это громко сказано, я только осваиваю прямые запросы,
сам то я больше по 8-ке, а тут вот угараздило устроится на фирму где
на 7.7 еще все крутится и на переход незнаю когда решатся.
приходиться работать ч/з OLEDB...
...и по-моему где-то в статье должно было быть написано по этому поводу, что
для использования в базах dbf требуется установка драйвера
select distinct
СпрКонтр.Descr as Контрагент,
СпрДог.Descr as Договор,
case when debkred=1 then Покуп.Sp2201 else 5 end as СуммаПрод ,
Sp2203 as СуммаСебест
from
ra2207 as покуп
LEFT JOIN SC92 as СпрДог
LEFT JOIN SC134 as СпрКонтр
ON СпрКонтр.sp125 = СпрДог.ID
ON Покуп.SP2195 = СпрДог.ID
доброго времени суток, sss999,
так попробуй
***
select distinct
СпрКонтр.Descr as Контрагент,
СпрДог.Descr as Договор,
case
when покуп.debkred=1 then Покуп.Sp2201
else 5
end as СуммаПрод ,
покуп.Sp2203 as СуммаСебест
from
ra2207 as покуп
LEFT JOIN SC92 as СпрДог
ON СпрКонтр.sp125 = СпрДог.ID
LEFT JOIN SC134 as СпрКонтр
ON Покуп.SP2195 = СпрДог.ID
***
1. пропущены псевдонимы таблиц в выделенных жырным местах
2. возможно провайдеру не понравились условия соединений все скопом в конце запроса
сравни:
---
select distinct
СпрКонтр.Descr as Контрагент,
СпрДог.Descr as Договор,
case
when Покуп.debkred=1 then $Покуп.СуммаПрод
else 5
end as СуммаПрод,
$Покуп.СуммаСебест as СуммаСебест
from
$Регистр.Продажи as Покуп
LEFT JOIN $Справочник.Договора as СпрДог
ON $СпрКонтр.ОсновнойДоговор = СпрДог.ID
LEFT JOIN $Справочник.Контрагенты as СпрКонтр
ON $Покуп.Контрагент = СпрДог.ID
---
куда наглядней
ниже указанный вариант у меня в консоли
выдал не "Command contains unrecognized phrase/keyword."
а более оптимистичное:
"File 'ra2207.dbf' does not exist."
***
select distinct
СпрКонтр.Descr as Контрагент,
СпрДог.Descr as Договор,
iif(покуп.debkred=1, Покуп.Sp2201, 5) as СуммаПрод,
покуп.Sp2203 as СуммаСебест
from
ra2207 as покуп
LEFT JOIN SC92 as СпрДог ON Покуп.SP2195 = СпрДог.ID
LEFT JOIN SC134 as СпрКонтр ON СпрКонтр.sp125 = СпрДог.ID
***
во всяких примерах надо выяснять для какой они базы - SQL или DBF.
запросы решающие одно и тоже могут сильно отличатся в зависимости от типа базы.
---
еще могу посоветовать достать где-нибудь дистрибутив Visual-FoxPro
установить его и смотреть мануал, идущий с ним.
Мне этот мануал был часто полезен.
не знаю почему у тебя chm не открываются.
у меня все нормально - и скачивается и открывается.
---
выкладываю скачанный архивчик.
загрузить смог?
только распакуй его перед тем как файлы *.chm открывать.
открываешь любой файл в архиве, например 1cpp.chm
и дальше роешься в мануале, как показано на скриншоте.
розовым отмечена та самая статья "о первых шагах".
можно еще выбрать запросом
select * from 1Sjourn все строки и посмотреть
что там в поле IDDocDef хранится
...
но поди угадай какое значение ответствует "Реализации"
---
нескромный вопрос - а МД-ник то где ???
Общие.Форма.Привязка::ПривязкаАтрибута(Строка ИДЭлемента=тVer, Строка ТипВ=T, Строка ИДЭлементаВ=Форма, Строка ТипГ=L, Строка ИДЭлементаГ=Форма) : Неверный идентификатор атрибута
Атрибут=РасширениеФормы.ПолучитьАтрибут(ИДЭлемента);
{КОП_ОбщиеФормаПривязка@MD(86) }
гРФорма.Привязка("тВремя,тВремяЗапроса,тСтрок,тСтрокКол,тКолонок,тКолонокКол,тVer","T","Форма","L","Форма");
{C:\USERS\LEYLA\DESKTOP\КОНСОЛЬ1CQA_ALL\КОНСОЛЬ1CQA\КОНСОЛЬ1CQA
Атрибут=РасширениеФормы.ПолучитьАтрибут(ИДЭлемента);
{КОП_ОбщиеФормаПривязка@MD(86) }
Подскажите, что не так?
;)
та невидимая таблица значений служит для
хранения результатов выполнения отдельных батчей пакета
разделенных командой GO (которая понимается только рулем скуля).
перед выполнением запроса в консоли
текст запроса "нарезается" на куски, разделенные командой GO.
и каждый такой кусок выполняется отдельно в цикле
(так сказать квази-пакетный запрос получается).
результаты к помещаются в выше упомянутую таблицу значений
и выводятся из нее в таблицу результата при выборе имени батча
в списке в правом верхнем углу.
проблем особых с привязками не было (и именно с классом из архива),
кроме разве что при работе в терминале на удаленном рабочем столе.
Приходилось даже для терминала класс подправлять.
(322)
Имена зарегистрированных классов:
Общие.Форма.Привязка = C:\Users\me\Documents\ge_rus\КОП_ОбщиеФормаПривязка.ert
а операционка, смотрю - либо Win-7 либо WinServ-2008
и учетка там "me"
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 Контрагент,Договор
$ВидДокумента.XXXX - это макро имя метапарсера 1cpp.
Метапарсер заменяет его на внутренний код вида документ с именем XXXX.
ты говорил, что у тебя база без метаданных, одни dbf-ники.
в этом случае скорее всего метапарсер выкинет ошибку
при формировании запроса провайдеру данных или заменит на что-то непотребное.
Если покуп.SP2198 - это поле реквизита регистра, имеющего тип "Документ" неопределенного вида,
то условие соединения
left JOIN 1Sjourn as Жур
ON Жур.IDDoc = покуп.SP2198
не верно.
содержимое такого поля формируется примерно как (IDDocDef + IDDoc).
Приду домой, пороюсь в старых примерах и отпишу как правильнее.
когда накладываю условие WHERE Жур.Date BETWEEN :НачДата~~ AND :КонДата~~ ниче не показывает
трудно понять почему,
много не ясного:
1.
ошибки валит или пустую выборку возвращает ?
2.
что за поле покуп.SP2198 регистра,
что за регистр ra2207,
и вообще из какой конфигурации выдернуты dbf-ники ??
имей ввиду:
накладывая отбор по дате
WHERE Жур.Date BETWEEN :НачДата~~ AND :КонДата~~
в своем примере ты налагаешь условие
не на дату документа, двигавшего по регистру
а на дату документов, на которые ссылается значение в поле покуп.SP2198 регистра.
я обычно по таким полям соединял примерно так
SELECT
*
FROM
$Регистр.Покупатели as Рег
INNER JOIN
1sjourn as Жур on Жур.iddoc = RIGHT($Рег.КредДокумент,9)
WHERE
Жур.Date BETWEEN :НачДата~~ AND :КонДата~~
Показатьэто к стати рабочий пример, тестировал на демо-базе типовой ТиС-7.7.
советую о хранении данных в 1с-7.7 почитать поподробней,
тогда многое будет понятней...
:)
---
Вкратце:
1)
поле ID (ссылка на справочник конкретного вида)
поле IDDOC (ссылка на документ конкретного вида)
это строковые значения типа Char9 (строка длины 9).
2)
В полях реквизитов типа "Справочник" или "Документ" (неопределенного вида)
хранится строковое значение типа Char13,
которое образуется из строкового 36-ричного представления
внутреннего кода вида справочника или документа (значение Char4)
и самого значения ссылки (значение Char9) - итого получается строка Char13.
идентификаторы пустых значений:
пустая ссылка определенного вида
${ПустойИД|EmptyID} = "_____0___"
пустая ссылка "неопределенного вида"
${ПустойИД13|EmptyID13} = "___0_____0___"
...
если метаимя пустого значения непроканает без md-ника,
то придется в запросе использовать вместо его строковый литерал
(почерки - заменить на пробелы!!!)
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 Контрагент,Договор
правильный вариант с использованием реквизита ДатаОплаты
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 Контрагент,Договор
я делал не через таблицу итоги а через движения,но видимо нужно их соединять,левым соединением,что бы вытащить нормально суммы не равные нулю,т.е. те которые закрылись они не нужны соответственно.а просто через таблицу движений у меня выводит как то все подряд,но главное то что при группировке не схлопываются суммы,хотя по кред документы должны были бы вроде
попробуй америкосовский формат
"mm/dd/yy"
по мануалу он "дефолтный"
или формат ANSY
"yy.mm.dd"
---
если не хочешь париться с форматом даты
используй встроенные функции:
DATE([nYear, nMonth, nDay])
DATETIME([nYear, nMonth, nDay [, nHours [, nMinutes [, nSeconds]]]])
быстро же ты,
пока в мануале foxpro рылся по форматам дат!
---
выкладываю этот мануал, если нужен
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
ты мне так и не разъяснил
почему ты упорно используешь внутренние имена таблиц в запросе
и почему метапарсер 1cpp.dll тебя не устраивает?
---
если база нормальная
(все dbf-ники соответствуют файлам 1cv7.md и 1cv7.dd)
то вместо внутренних имен
лучше использовать соответствующие им мета-имена.
есть два соображения для использования мета-имен:
1) наглядность и смысловая прозрачность:
мне, например, сейчас трудно вникать
в смысл полей в тексте запросе
с именами вроде sp2201 или sp2198.
и ты сам через год забудешь,
какие из этих полей что означают
и тоже будешь голову ломать.
2) системные соображения:
внутренние имена таблиц и их полей
могут измениться после реструктуризации базы данных
при обновлении конфигурации (хоть и мало вероятно)
...
и тогда что будет с твоим запросом???
внутреннее представление ссылки на значение перечисления - строка char9.
в запросах можно получать с помощью метаимен:
идентификатор значения перечисления:
${Перечисление|Enumeration}.<Перечисление>.<ЗначениеПеречисления> : char(9)
${Перечисление23|Enumeration23}.<Перечисление>.<ЗначениеПеречисления> : char(23)
можно в консоли с включеной галкой "Выводить текст" выполнить запрос вроде
sel ect
$Перечисление.КодыОпераций.ЗачтенАвансПоставщику
fr om
1ssystem
и скопировать строковое представление из окна сообщений.
Если заметил,
запрос состоит из ПОЛНОГО ОБЪЕДИНЕНИЯ (FULL JOIN)
двух подзапросов:
- подзапроса остатков на дату начала;
- подзапроса оборотов за период;
Конечные остатки вычисляются по начальным остаткам и оборотам за период.
---
функция NVL() - возвращает первый аргумент, если он не NULL,
и второй аргумент в противном случае (аналог ISNULL() из T-SQL).
---
Ее использование требуется для разруливания ситуаций:
- когда начальных остатков нет, а обороты есть;
- или когда начальные остатки есть, а оборотов нет;
Период с ДатаНачала по ДатаКонца;
Фирма = Регистр.Покупатели.Фирма;
УпрАналитика = Регистр.Покупатели.Фирма.УпрАналитика;
ЮрЛицо = Регистр.Покупатели.Фирма.ЮрЛицо;
Контрагент = Регистр.Покупатели.Договор.Владелец;
СвойствоКонтр = Регистр.Покупатели.Договор.Владелец.ОсновноеСвойство.ЗначениеСвойства;
Договор = Регистр.Покупатели.Договор;
КодОперации = Регистр.Покупатели.КодОперации;
ДнейКредита = Регистр.Покупатели.Договор.ГлубинаКредита;
СуммаКредита = Регистр.Покупатели.Договор.СуммаКредита;
СтавкаНП = Регистр.Покупатели.СтавкаНП;
ВидДолга = Регистр.Покупатели.ВидДолга;
КредДокумент = Регистр.Покупатели.КредДокумент;
Проект = Регистр.Покупатели.ТекущийДокумент.Проект;
СуммаВ = Регистр.Покупатели.СуммаВал;
Сумма = Регистр.Покупатели.СуммаРуб;Функция НачОст = НачОст(Сумма);
Функция Приход = Приход(Сумма);
Функция Расход = Расход(Сумма);
Функция КонОст = КонОст(Сумма);
Функция НачОстВ = НачОст(СуммаВ);
Функция ПриходВ = Приход(СуммаВ);
Функция РасходВ = Расход(СуммаВ);
Функция КонОстВ = КонОст(СуммаВ);
Функция ВозвратОтПокупателя = Расход(Сумма)Когда (КодОперации = глКО.ВозвратОтПокупателя);
Функция ВозвратПоставщику = Приход(Сумма)Когда (КодОперации = глКО.ВозвратПоставщику);
Функция ВозвратОтПокупателяВ = Расход(СуммаВ)Когда(КодОперации = глКО.ВозвратОтПокупателя);
Функция ВозвратПоставщикуВ = Приход(СуммаВ)Когда (КодОперации = глКО.ВозвратПоставщику);
Функция КонОстП = КонОст(Сумма)Когда((ПустоеЗначение(ДатаОплаты(КредДокумент)) = 0)и(ДатаОплаты(КредДокумент) < ДатаКонца));
Функция КонОстВП= КонОст(СуммаВ)Когда((ПустоеЗначение(ДатаОплаты(КредДокумент)) = 0)и(ДатаОплаты(КредДокумент) < ДатаКонца));Группировка Контрагент без групп;Группировка Договор;
Условие ((КодОперации <> глКО.ЗачтенАвансПоставщику) И (КодОперации <> глКО.ЗачтенАвансПоставщикуВал));
Условие (КодОперации <> глКО.ЗачтенАвансПокупателя);
Условие (КодОперации <> глКО.СторнированАванс);
Условие (КодОперации <> глКО.ЗачтенВозвратПокупателя);
Условие (КодОперации <> глКО.ЗачтенВозвратПоставщику);
Условие (КодОперации <> глКО.СторнированВозврат);
попробую изобразить этот 1с-ный запрос (117)
через прямой, но:
- используя мета-имена 1cpp.
- на типовой (или почти типовой) ТиС-7.7
(надеюсь у тебя сам регистр "Покупатель" не сильно изменен).
- без оптимизации с обращением к таблицам итогов
(только по движениям регистра).
ну вот и выкладываю, что смог из мозга выжать:
в целом запрос соответствует 1с-ному запросу в (117) с замечаниями:
- измерения в выборке ограниченны полями Фирма, Контрагент(Договор), КредитДокумент;
- с оборотами возвратов от покупателей и поставщиков я заморачиваться не стал;
- при вычислении "просроченных" задолженностей учитывается только дата оплаты
по кредит-документам вида "Реализация". По остальным задолженность считается "непросроченной".
- запрос в общем-то не оптимален, поскольку для вычисления начальных остатков выгребает
весь движняк из регистра до даты начала и служит для методических целей.
Для оптимизации нужно использовать таблицы итогов и это уже целая отдельная тема
(читай в статье TSQLInV7FirstSteps.chm из архива документации к 1cpp.dll).
ВедомостьПокупателей.Фирма 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 ВедомостьПокупателей
Выполни этот запрос в консоли в "родной" для твоих dbf-ников базе.
(можно взять из файла во вложении к предыдущему посту)
Если в консоли установить галку "Выводить текст",
то при выполнении запроса в окно сообщений будет
выведен текст запроса, после обработки мета-парсером.
этот "транслированный" текст запроса можно будет пробовать использовать в других базах.
Большой, потому-что задача решена в общей постановке.
Если попытаться оптимизировать с обращением к итогам, то будет еще громозче.
Но се ля ви
...
Примерно так выглядят все запросы виртуальных таблиц итогов по регистрам.
К стати таблица РегистрОстаткиОбороты - самая сложная из них.
о просроченной задолженности, которая коностп:
она равная конечному остатку, если
дата оплаты кредит документа заполнена и меньше конечной даты.
---
я в своем запросе дату оплаты смотрел только по документам "Реализация".
Этим и объясняются отличия,
поскольку в базе наверняка есть кредит-документы других видов,
имеющие реквизит "ДатаОплаты"
(это могут быть возвраты от покупателя и отчеты комиссионера).
---
поэтому кроме Реализации придется одновременно соединять итоги по регистру
еще и с таблицами кредит-документов других видов, чтоб вытянуть дату оплаты
(а вытягивается она хреновато - сразу из N таблиц)
ну не знаю, что в твоих базах творится.
---
в моей демо-базе в регистре "Покупатели"
засветились кредит-документы с реквизитом "ДатаОплаты"
следующих видов:
- ОтчетКомитенту
- ВводОстатковПокупателя
- Реализация
- РеализацияРозница
- ВозвратОтПокупателя
---
Целых пять! И по идее все их надо учитывать в запросе!!!
через индексированную таблицу - ОДНОЗНАЧНО ЛУЧШЕ!!!
сам оценишь всю мощь этого объекта, когда более менее разберешься с ним.
мне так не хватает "ИндексированныхТаблиц" в 1с-8.х !!!
--
1. в первую очередь - по производительности.
Группировку, сортировку, подсчет итогов индексированная таблица выполняет гораздо быстрее.
2. во вторую очередь - из-за дополнительных возможности объекта:
- подсчет итогов по диапазону значений выбранного ключа.
- возможность соединения нескольких выборок данных
(объектный аналог оператора JOIN языка запросов).
- возможность объединения нескольких однотипных выборок в одну
(объектный аналог оператора UNION языка запросов).
...
ПОСЛЕДНЕЕ ДЛЯ ТЕБЯ НАВЕРНОЕ БУДЕТ ОЧЕНЬ ИНТЕРЕСНО,
поскольку у тебя как я понял надо сделать отчет
по данным "дебеторки" из трех разных баз.
дело хозяйское ...
я переписал бы вывод на печать - это не так уж сложно, по сравнению с запросом.
:)
---
могу посоветовать объединить отдельные выборки и
сгруппировать итоговую выборку
с помощью индексированной таблицы.
после чего "вывести" результат группировки в обычную тз
для последующего вывода на печать.
Перемудрил ты с курсором.
Курсоры - это программные объекты для построчной манипуляции с выборками данных.
Имя курсора нельзя далее использовать в самом запросе.
Используя ссылку на открытый курсор,
в коде можно затем программно перебирать и обрабатывать выборку данных.
(если программная среда это позволяет).
---
Но непосредственная работа с курсорами как таковыми - это тема не для 1С, даже улучшенной 1cpp.dll.
Хотя объекты типа "Справочник" или "Документ" выполняя выборку элементов фактически используют курсоры.
так что используй вариант
sel ect *** fr om *** INTO TABLE #ИмяВТ
---
при этом постарайся
1. не назвать неудачно временную таблицу
(а то можешь уничтожить какиенибудь данные).
2. подчищать после себя мусор - для порядка.
---
ниже простенький рабочий примерчик для справочника "Номенклатура"
from $Справочник.Номенклатура
INTO TABLE #Номенклатура
GO -- SelectIntoTable#Номенклатура
select Таб.Ссылка as [Ссылка$$Справочник.Номенклатура]
fr om #Номенклатура as Таб
GO -- Select#Номенклатура
dr op table #Номенклатура
GO -- Drop#Номенклатура
---
Оператор GO - "работает" только в консоли !!!
Он фактически нарезает текст запроса на куски,
которые консоль отдельно выполняет в цикле.
что-то ты все как-то непростыми путями идешь.
:)
---
насколько я осознал порывшись в мануале foxpro
1. - убирать разделители строк в виде "..."+CHR(13)+"..." нельзя
2. - а после INTO - обязательно нужно указать TABLE
---
впрочем спасибо
использование EXECSCRIPT( ) в запросе для меня было новостью
я как-то все больше со скульными базами имею дело.
дбф - представляют для меня больше теоретический интерес
:)
к стати похоже разрывать оператор sel ect переносами строк
как это обычно можно делать
в этом случае нельзя !!!
---
этот пример выдает ошибку:
---
EXECSCRIPT(
"sel ect id as Ссылка"+
CHR(13)+
"fr om $Справочник.Номенклатура INTO TABLE #Номенклатура)"+
CHR(13)+
"select Таб.Ссылка as [Ссылка$Справочник.Номенклатура] fr om #Номенклатура as Таб")
нет, решетка - необязательна.
так именуются временные таблицы в MS SQL.
но именовать временные таблицы надо осторожно.
если вдруг это имя совпадет с именем таблицы с данными
(например таблицей регистра) - то эти данные будут потеряны!!!
так же будет неприятно,
если затрешь данные существующей еще нужной временной таблицы.
особая тема - возможность конфликтов в многопользовательском режиме:
когда несколько разных юзеров одновременно захотят
выполнить запрос с одинаковыми именами временных таблиц.
да я вроде писал про это в посте (154):
к стати похоже разрывать оператор select переносами строк
как это обычно можно делать
в этом случае нельзя !!!
не понимает EXECSCRIPT() "многострочные" операторы запросов.
надо извращаться в одну строку
:)
дык, берешь по простому и пишешь в консоли:
---
sel ect
id as фирма,
descr as фирма_наименование,
code as фирма_код
fr om $Справочник.Фирмы
INTO TABLE TempTmpTable1
---
при этом в каталоге базы появляется файл TempTmpTable1.dbf
EXECSCRIPT(' SEL ECT * INTO CURSOR TempTmpTable1 NOFILTER fr om ( '+
' SEL ECT '+
' SUM(РегПродажа_04.SP2222) as Себест__период_1, '+
' SUM(РегПродажа_04.SP2223) as ПродСтоимость__период_1, '+
' SUM(РегПродажа_04.SP2224) as Количество__период_1, '+
' SUM(РегПродажа_04.SP2225) as СебестВ__период_1, '+
' SUM(РегПродажа_04.SP2226) as ПродСтоимостьВ__период_1, '+
' SUM(РегПродажа_04.SP2227) as КоличествоВ__период_1, '+
' СпрФирмы_04.DESCR as Фирма, '+
' СпрКонтр_04.DESCR as Покупатель, '+
' СпрНомен_04.DESCR as Номенклатура '+
' FR OM '+
' _RA2228_04 as РегПродажа_04 '+
' LEFT JOIN _1SJOURN_04 as Журн_04 ON РегПродажа_04.IDDOC = Журн_04.IDDOC '+
' LEFT JOIN _SC156_04 as СпрНомен_04 ON РегПродажа_04.SP2218 = СпрНомен_04.ID '+
' LEFT JOIN _SC134_04 as СпрКонтр_04 ON РегПродажа_04.SP2219 = СпрКонтр_04.ID '+
' LEFT JOIN _SC134_04 as СпрКонтрП_04 ON РегПродажа_04.SP2220 = СпрКонтрП_04.ID '+
' LEFT JOIN _SC331_04 as СпрФирмы_04 ON РегПродажа_04.SP2221 = СпрФирмы_04.ID '+
' WHERE Журн_04.DATE BETWEEN {^ 2013-10-01} AND {^ 2013-10-29} '+
' GROUP BY Фирма,Покупатель,Номенклатура '+
' UNI ON ALL '+
' SELECT '+
' SUM(РегПродажа_Old.SP2222) as Себест__период_1, '+
' SUM(РегПродажа_Old.SP2223) as ПродСтоимость__период_1, '+
' SUM(РегПродажа_Old.SP2224) as Количество__период_1, '+
' SUM(РегПродажа_Old.SP2225) as СебестВ__период_1, '+
' SUM(РегПродажа_Old.SP2226) as ПродСтоимостьВ__период_1, '+
' SUM(РегПродажа_Old.SP2227) as КоличествоВ__период_1, '+
' СпрФирмы_Old.DESCR as Фирма, '+
' СпрКонтр_Old.DESCR as Покупатель, '+
' СпрНомен_Old.DESCR as Номенклатура '+
' FR OM '+
' _RA2228_Old as РегПродажа_Old '+
' LEFT JOIN _1SJOURN_Old as Журн_Old ON РегПродажа_Old.IDDOC = Журн_Old.IDDOC '+
' LEFT JOIN _SC156_Old as СпрНомен_Old ON РегПродажа_Old.SP2218 = СпрНомен_Old.ID '+
' LEFT JOIN _SC134_Old as СпрКонтр_Old ON РегПродажа_Old.SP2219 = СпрКонтр_Old.ID '+
' LEFT JOIN _SC134_Old as СпрКонтрП_Old ON РегПродажа_Old.SP2220 = СпрКонтрП_Old.ID '+
' LEFT JOIN _SC331_Old as СпрФирмы_Old ON РегПродажа_Old.SP2221 = СпрФирмы_Old.ID '+
' WH ERE Журн_Old.DATE BETWEEN {^ 2013-10-01} AND {^ 2013-10-29} '+
' GROUP BY Фирма,Покупатель,Номенклатура '+
' UNION ALL '+
' SEL ECT '+
' SUM(РегПродажа.SP2222) as Себест__период_1, '+
' SUM(РегПродажа.SP2223) as ПродСтоимость__период_1, '+
' SUM(РегПродажа.SP2224) as Количество__период_1, '+
' SUM(РегПродажа.SP2225) as СебестВ__период_1, '+
' SUM(РегПродажа.SP2226) as ПродСтоимостьВ__период_1, '+
' SUM(РегПродажа.SP2227) as КоличествоВ__период_1, '+
' СпрФирмы.DESCR as Фирма, '+
' СпрКонтр.DESCR as Покупатель, '+
' СпрНомен.DESCR as Номенклатура '+
' FR OM '+
' RA2228 as РегПродажа '+
' LEFT JOIN 1SJOURN as Журн ON РегПродажа.IDDOC = Журн.IDDOC '+
' LEFT JOIN SC156 as СпрНомен ON РегПродажа.SP2218 = СпрНомен.ID '+
' LEFT JOIN SC134 as СпрКонтр ON РегПродажа.SP2219 = СпрКонтр.ID '+
' LEFT JOIN SC134 as СпрКонтрП ON РегПродажа.SP2220 = СпрКонтрП.ID '+
' LEFT JOIN SC331 as СпрФирмы ON РегПродажа.SP2221 = СпрФирмы.ID '+
' WH ERE Журн.DATE BETWEEN {^ 2013-10-01} AND {^ 2013-10-29} '+
' GROUP BY Фирма,Покупатель,Номенклатура ) as WW ')
EXECSCRIPT(' SEL ECT * fr om ( SEL ECT '+
' ВедомостьПокупателей.Фирма as [Фирма], '+
' ВедомостьПокупателей.Контрагент as [Контрагент], '+
' СпрКонтр.descr as DescrКонт, '+
' спрФирмы.Descr as ФирмDescr, '+
' ВедомостьПокупателей.Договор as [Договор], '+
' ВедомостьПокупателей.КредДокумент as [КредДокум], '+
' ВедомостьПокупателей.НачОст as НачОст, '+
' ВедомостьПокупателей.НачОстВ as НачОстВ, '+
' ВедомостьПокупателей.Приход as Приход, '+
' ВедомостьПокупателей.ПриходВ as ПриходВ, '+
' ВедомостьПокупателей.Расход as Расход, '+
' ВедомостьПокупателей.РасходВ as РасходВ, '+
' ВедомостьПокупателей.КонОст as КонОст, '+
' ВедомостьПокупателей.КонОстВ as КонОстВ, '+
' ВедомостьПокупателей.КонОстП as КонОстП, '+
' ВедомостьПокупателей.КонОстВП as КонОстВП '+
' FR OM '+
' (SEL ECT '+
' ОстаткиОбороты.Фирма as Фирма, '+
' спрКонтр.ID as Контрагент, '+
' ОстаткиОбороты.Договор as Договор , '+
' Max(ОстаткиОбороты.КредДокумент)as КредДокумент, '+
' SUM(ОстаткиОбороты.НачОст) as НачОст, '+
' SUM(ОстаткиОбороты.НачОстВ) as НачОстВ, '+
' SUM(ОстаткиОбороты.Приход) as Приход, '+
' SUM(ОстаткиОбороты.ПриходВ) as ПриходВ, '+
' SUM(ОстаткиОбороты.Расход) as Расход, '+
' SUM(ОстаткиОбороты.РасходВ) as РасходВ, '+
' SUM(ОстаткиОбороты.КонОст) as КонОст, '+
' SUM(ОстаткиОбороты.КонОстВ) as КонОстВ, '+
' SUM(ICASE(ISNULL(докРеализ.IDDOC),icase(ISNULL(докВозврат.IDDOC),0, '+
' (докВозврат.SP539 >= {^ 900-01-01’} and (докВозврат.SP539 < {^ 2013-10-01}), '+
' ОстаткиОбороты.КонОст,0),(докРеализ.sp1175 >= {^ 900-01-01’} AND '+
' (докРеализ.sp1175 < {^ 2013-10-01} ), '+
' ОстаткиОбороты.КонОст,0)) as КонОстП, '+
' SUM(ICASE(ISNULL(докРеализ.IDDOC),0,(докРеализ.sp1175 >= {^ 900-01-01’} AND '+
' (докРеализ.sp1175 < {^ 2013-10-01} ), '+
' ОстаткиОбороты.КонОстВ,0)) as КонОстВП '+
' FROM '+
' (SELECT '+
' 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 '+
' Рег.sp2194 as Фирма, '+
' Рег.sp2195 as Договор, '+
' Рег.sp2198 as КредДокумент, '+
' SUM((1 - Рег.debkred * 2)*Рег.sp2201) as НачОст, '+
' SUM((1 - Рег.debkred * 2)*Рег.sp2199) as НачОстВ '+
' FR OM '+
' ra2207 as Рег '+
' INNER JOIN '+
' 1SJOURN as Жур ON Рег.IDDOC = Жур.IDDOC '+
' WH ERE '+
' Жур.DATE < {^ 2005-12-01} '+
' AND NOT INLIST(Рег.sp2204 '+
' ,[ 1FS ] '+
' ,[ 1GR ] '+
' ,[ 1FR ] '+
' ,[ 1GN ] '+
' ,[ 1FT ] '+
' ,[ 1FU ] '+
' ,[ 1GO ] '+
' ) '+
' GROUP BY '+
' Рег.sp2194, '+
' Рег.sp2195, '+
' Рег.sp2198) as Остатки '+
' FULL JOIN '+
' (SELECT '+
' Рег.sp2194 as Фирма, '+
' Рег.sp2195 as Договор, '+
' Рег.sp2198 as КредДокумент, '+
' SUM(IIF(Рег.debkred = 1,0,Рег.sp2201)) as Приход, '+
' SUM(IIF(Рег.debkred = 1,0,Рег.sp2199)) as ПриходВ, '+
' SUM(IIF(Рег.debkred = 1,Рег.sp2201,0)) as Расход, '+
' SUM(IIF(Рег.debkred = 1,Рег.sp2199,0)) as РасходВ '+
' FR OM '+
' ra2207 as Рег '+
' INNER JOIN '+
' 1SJOURN as Жур ON Рег.IDDOC = Жур.IDDOC '+
' WH ERE '+
' Жур.DATE BETWEEN {^ 2005-12-01} AND {^ 2013-10-01} '+
' AND NOT INLIST(Рег.sp2204 '+
' ,[ 1FS ] '+
' ,[ 1GR ] '+
' ,[ 1FR ] '+
' ,[ 1GN ] '+
' ,[ 1FT ] '+
' ,[ 1FU ] '+
' ,[ 1GO ] '+
' ) '+
' GROUP BY '+
' Рег.sp2194, '+
' Рег.sp2195, '+
' Рег.sp2198) as Обороты '+
' ON Остатки.Фирма = Обороты.Фирма '+
' AND Остатки.Договор = Обороты.Договор '+
' AND Остатки.КредДокумент = Обороты.КредДокумент) as ОстаткиОбороты '+
' INNER JOIN sc92 as спрДогов ON спрДогов.ID = ОстаткиОбороты.Договор '+
' INNER JOIN sc134 as спрКонтр ON спрКонтр.ID = спрДогов.ParentExt '+
' LEFT JOIN dh1191 as докРеализ ON докРеализ.IDDOC = RIGHT(ОстаткиОбороты.КредДокумент, '+
' 9) '+
' LEFT JOIN dh558 as докВозврат ON докВозврат.IDDOC = RIGHT(ОстаткиОбороты.КредДокумент'+
' ,9) '+
' GROUP BY '+
' ОстаткиОбороты.Фирма, '+
' спрКонтр.ID, '+
' ОстаткиОбороты.Договор) as ВедомостьПокупателей '+
' INNER JOIN sc134 as спрКонтр ON спрКонтр.ID=ВедомостьПокупателей.Контрагент '+
' INNER JOIN sc331 as спрФирмы ON спрФирмы.ID=ВедомостьПокупателей.Фирма '+
' Order by спрФирмы.Descr,спрКонтр.Descr ) as WW INTO table TempTmpTable1')
ВедомостьПокупателей.Фирма as [Фирма$Справочник.Фирмы],
ВедомостьПокупателей.Контрагент as [Контрагент$Справочник.Контрагенты],
ВедомостьПокупателей.КредДокумент as [КредДокумент$Документ],
ВедомостьПокупателей.НачОст as НачОст,
ВедомостьПокупателей.НачОстВ as НачОстВ,
ВедомостьПокупателей.Приход as Приход,
ВедомостьПокупателей.ПриходВ as ПриходВ,
ВедомостьПокупателей.Расход as Расход,
ВедомостьПокупателей.РасходВ as РасходВ,
ВедомостьПокупателей.КонОст as КонОст,
ВедомостьПокупателей.КонОстВ as КонОстВ,
ВедомостьПокупателей.КонОстП as КонОстП,
ВедомостьПокупателей.КонОстВП as КонОстВП
FR OM
(SEL ECT
ВедПок.Фирма,
ВедПок.Контрагент,
ВедПок.КредДокумент,
SUM(ВедПок.НачОст) as НачОст,
SUM(ВедПок.НачОстВ) as НачОстВ,
SUM(ВедПок.Приход) as Приход,
SUM(ВедПок.ПриходВ) as ПриходВ,
SUM(ВедПок.Расход) as Расход,
SUM(ВедПок.РасходВ) as РасходВ,
SUM(ВедПок.КонОст) as КонОст,
SUM(ВедПок.КонОстВ) as КонОстВ,
SUM(ICASE(ВедПок.ДатаОплаты >= {d’1900-01-01’} AND ВедПок.ДатаОплаты < :КонДата~~,ВедПок.КонОст,0)) as КонОстП,
SUM(ICASE(ВедПок.ДатаОплаты >= {d’1900-01-01’} AND ВедПок.ДатаОплаты < :КонДата~~,ВедПок.КонОстВ,0)) as КонОстВП
FR OM
(SEL ECT
ОстаткиОбороты.Фирма,
спрКонтр.ID as Контрагент,
ОстаткиОбороты.КредДокумент,
ОстаткиОбороты.НачОст as НачОст,
ОстаткиОбороты.НачОстВ as НачОстВ,
ОстаткиОбороты.Приход as Приход,
ОстаткиОбороты.ПриходВ as ПриходВ,
ОстаткиОбороты.Расход as Расход,
ОстаткиОбороты.РасходВ as РасходВ,
ОстаткиОбороты.КонОст as КонОст,
ОстаткиОбороты.КонОст as КонОстВ,
NVL($КДок1.ДатаОплаты,NVL($КДок2.ДатаОплаты,NVL($КДок3.ДатаОплаты,NVL($КДок4.ДатаОплаты,NVL($КДок5.ДатаОплаты,{d’0001-01-01’}))))) as ДатаОплаты
FROM
-- подзапрос, как-то реализующий ВТ $РегистрОстаткиОбороты.Покупатели(:НачДата~~,:КонДата~~) для DBF
(SELECT
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 КДок1 ON КДок1.IDDOC = RIGHT(ОстаткиОбороты.КредДокумент,9)
LEFT JOIN $Документ.РеализацияРозница as КДок2 ON КДок2.IDDOC = RIGHT(ОстаткиОбороты.КредДокумент,9)
LEFT JOIN $Документ.ВозвратОтПокупателя as КДок3 ON КДок3.IDDOC = RIGHT(ОстаткиОбороты.КредДокумент,9)
LEFT JOIN $Документ.ОтчетКомитенту as КДок4 ON КДок4.IDDOC = RIGHT(ОстаткиОбороты.КредДокумент,9)
LEFT JOIN $Документ.ВводОстатковПокупателя as КДок5 ON КДок5.IDDOC = RIGHT(ОстаткиОбороты.КредДокумент,9)
) as ВедПок
GROUP BY
ВедПок.Фирма,
ВедПок.Контрагент,
ВедПок.КредДокумент) as ВедомостьПокупателей
а я особо и не парюсь
:)
...
вообще первое образование у меня - физическое.
а в физике используют методологию для выяснения какая из теорий правильней.
вкратце суть методологии выражается афоризмом:
Зачем делать сложным, то что проще простого.
:Выбдата~~ + УстановитьТекстовыйПараметр - наш выбор+
Для корректного текста запроса в дбф нужно переписывать весь текст запроса для попадания в индекс.
Иначе, никакой приемлемой скорости от фокса не поиметь.
Это учтено у вас в тексте запроса ?
| and $Рег.Фирма IN (SEL ECT Val FR OM #Группа)";
//| and $Рег.Фирма=:ВыбФирма";
RS.УложитьСписокОбъектов(ВыбРазделитель1, "#Группа", "Фирмы"); пишу текст говорит таблица группа.dbf not exist
,я бы его назвал кривой запрос а не прямой.RS.УстановитьПараметр("Фирмы",ВыбРазделитель1); говорит список параметров пуст.вот блин г..
если RS в твоем примере - это объект OLEDBCommand
то укладка списка элементов или группы справочника во временную таблицу
имеет свои особенности ...
(почитал бы ты, брат Гораций, мануал).
:)
Задать руками в этом методе имя временной таблицы нельзя.
Метод генерит это имя автоматически и возвращает его через второй аргумент.
Причем сгенерированное имя представляет собой строку GUID:
Это выдержка из мануала:
ВрТабл = "";
cmd.УложитьСписокОбъектов(ТекГруппа, ВрТабл, "Номенклатура");
Сообщить("Что тут: " + ВрТабл); // Например, "Что тут: 858573b1-5a6f-459e-9c75-ec63e2a1d858"
эту строку GUID можно использовать в тексте запроса напрямую,
ну или как предлагает в (218) Ёпрст.
|....IN (SEL ECT Val FR OM :ВыбФирма)
.....
врГруппа="";
Запрос.УложитьСписокОбъектов(СписокФирм, врГруппа,"Фирмы");//СписокФирм или СЗ на форме, или элемент диалога, куда можно выбрать группу
Запрос.УстановитьТекстовыйПараметр("ВыбФирма", врГруппа);
так оно примерно и есть
(223) sss999,
ВО ВЛОЖЕНИИ ПОСТА В АРХИВ
там все по 1cpp
+ справка по foxpro
+ ,бонус - справка по 1sqlite
все в формате .chm
так оно примерно и есть
(223) sss999,
ВО ВЛОЖЕНИИ ПОСТА В АРХИВ
там все по 1cpp
+ справка по foxpro
+ ,бонус - справка по 1sqlite
все в формате .chm
так оно примерно и есть
(223) sss999,
ВО ВЛОЖЕНИИ ПОСТА В АРХИВ
там все по 1cpp
+ справка по foxpro
+ ,бонус - справка по 1sqlite
все в формате .chm
так оно примерно и есть
(223) sss999,
ВО ВЛОЖЕНИИ ПОСТА В АРХИВ
там все по 1cpp
+ справка по foxpro
+ ,бонус - справка по 1sqlite
все в формате .chm
не совсем так...
метапарсер распознает "агрегатные типы" установленного значения параметра и
соответствующим образом преобразует его к внутреннему строковому представлению ссылки.
Более того есть еще модификаторы параметра,
позволяющие преобразовать значение к значению "Справочник" или "Документ" неопределенного вида
или к значению "Неопределенного" типа (читай подробней в мануале).
(231) sss999,
наврятли,
я слышал на счет проблем с точностью в ADO при использовании чисел с плавающей точностью
(тип float), но насколько я знаю тип float 1c-совцы почему-то не уважают и не используют.
...
впрочем у меня практического опыта прямых запросов в dbf не сильно много.
может Ёпрст что-нибудь подскажет.
SEL ECT
Рег.iddoc as [Докум$Документ],
Рег.sp2204 as [код$Перечисление.КодыОпераций],
Рег.sp2194 as Фирма,
Рег.sp2195 as Договор,
Рег.sp2198 as [КредДокумент$Документ],
IIF(Рег.debkred = 1,0,Рег.sp2201) as Приход,
IIF(Рег.debkred = 1,0,Рег.sp2199) as ПриходВ,
IIF(Рег.debkred = 1,Рег.sp2201,0) as Расход,
IIF(Рег.debkred = 1,Рег.sp2199,0) as РасходВ,
Жур.IDDocDef as Доквид
FR OM
ra2207 as Рег
Left JOIN sc331 as спрФирмы ON спрФирмы.ID=Рег.sp2194
inner JOIN
1SJOURN as Жур ON Рег.IDDOC = Жур.IDDOC
Left JOIN sc92 as спрДогов ON спрДогов.ID = Рег.sp2195
Left JOIN sc134 as спрКонтр ON спрКонтр.ID = спрДогов.ParentExt
Where спрКонтр.descr = 'Контрагент' and
Жур.DATE BETWEEN {d '2000-01-01'} AND {d '2013-10-29'}
AND спрФирмы.descr= 'Основная Фирма'
***
SEL ECT
Рег.iddoc as [Докум$Документ],
Жур.IDDocDef as Докум_вид,
Рег.sp2204 as [код$Перечисление.КодыОпераций],
Рег.sp2194 as Фирма,
Рег.sp2195 as Договор,
Рег.sp2198 as [КредДокумент$Документ],
IIF(Рег.debkred = 1,0,Рег.sp2201) as Приход,
IIF(Рег.debkred = 1,0,Рег.sp2199) as ПриходВ,
IIF(Рег.debkred = 1,Рег.sp2201,0) as Расход,
IIF(Рег.debkred = 1,Рег.sp2199,0) as РасходВ
FR OM
ra2207 as Рег
Left JOIN sc331 as спрФирмы ON спрФирмы.ID=Рег.sp2194
inner JOIN
1SJOURN as Жур ON Рег.IDDOC = Жур.IDDOC
Left JOIN sc92 as спрДогов ON спрДогов.ID = Рег.sp2195
Left JOIN sc134 as спрКонтр ON спрКонтр.ID = спрДогов.ParentExt
Where спрКонтр.descr = 'Контрагент' and
Жур.DATE BETWEEN {d '2000-01-01'} AND {d '2013-10-29'}
AND спрФирмы.descr= 'Основная Фирма'
***
Дело в том, что метапарсер использует для типизации
значений "Документ" определенного вида два поля:
1. в одном содержится значение IDDOC
- его алиас может быть любым.
2. во втором содержится значение IDDOCDEF
- его псевдоним должен состоять из алиаса первого поля, дополненного строкой "_вид" - регистро-зависимо!!!
left join с таблицей журнала не имеет смысла:
если что-то есть в шапках документа или в регистрах
и одновременно этого нет в связанной с ними по IDDOC таблице журнала
- то это явный системный косяк в данных!!!
насколько я помню ни в таблице журнала ни в таблицах шапок документов поля descr нету. Так-что так просто не получится.
...
есть строки-типизаторы "ВидДокумента" и "ВидДокументаПредставление",
используемые примерно так:
select
***
Жур.IDDOCDEF as [ВидДок$ВидДокумента],
Жур.IDDOCDEF as [ВидДок$ВидДокументаПредставление],
***
Надо полагать (сам не проверял) выводят для документа в колонку результата
строковые значения вида документа и представление вида (синоним).
Но это только начало настоящего строкового представления документа.
думаю единственный вариант накрутить что-нибудь в этом роде:
ICASE(Жур.IDDocDef = $ВидДокумента.Реализация, 'Реализация',
Жур.IDDocDef = $ВидДокумента.ВозвратОтПокупателя, 'Возврат от покупателя',
'Непредусмотренный вид') + ' № ' + STR(Жур.docno) + '(' + DTOC(Жур.date) + ')'
т.е. вручную перечислить в ICASE все возможные варианты
...
только вместо $ВидДокумента
возможно придется воспользоваться другим метаименем - $ВидДокумента36.
вот этот вариант проверен:
***
sel ect
ICASE(Жур.IDDocDef = $ВидДокумента.Реализация, 'Реализация',
Жур.IDDocDef = $ВидДокумента.ВозвратОтПокупателя, 'Возврат от покупателя',
'Непредусмотренный вид') + ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')' as ДокНаименование,
Жур.IDDOCDEF as [ВидДок$ВидДокумента],
Жур.IDDOCDEF as [ПредДок$ВидДокументаПредставление],
Жур.IDDOCDEF, *
fr om 1sjourn as Жур
***
под 1cpp.dll версии 3.2.2.0, что стоит у меня,
строки-типизаторы "ВидДокумента" и "ВидДокументаПредставление",
описанные в документации, - не работают.
по видимому, это добавлено в более поздних версиях библиотеки
литерал NULL в foxpro имеется, но с его использованием какие-то заморочки.
***
например такой запрос выполняется без ошибок:
sel ect
IIF(1=0,NULL,1) as null_value
from
1ssystem
***
а такой (почти такой же) уже с ошибкой времени выполнения:
select
IIF(1=1,NULL,1) as null_value
fr om
1ssystem
сообщает, что "cannot determine datatype of SQL Column: NULL_VALUE"
...
возможно это можно как-то поправить с помощью настроек foxpro
вопрос о производительности - он тонкий ... как Восток.
***
если отчет мотается приемлемо быстро ...
если много дешевых аппаратных ресурсов ...
то зачем дальше заморачиваться - нажми на кнопку и получишь результат.
***
мой начальник, например, вообще считает нормальным,
если "аналитический" отчет мотается минут 5-10.
Ну а вообще в последнее время мне постоянно
приходится оптимизировать отчеты разными способами,
разгоняя их раз в 10, иногда - на собственную голову.
Разогнал как то раз любимый гипер-отчет генерального
(в который выводилось все, включая анализ мочи продавцов).
Раньше за год его нельзя было смотать, теперь можно.
И началось...а почему так мотается, а не эдак!!!
// Функция задержки выполнения процесса.
//
Процедура ЗадержкаВВыполнении(ВремяОжидания)
Попытка
xPing = "ping -n 1 -w "+Формат(1000*ВремяОжидания, "ЧГ=0")+" 127.255.255.255";
WshShell = СоздатьОбъект("WScript.Shell");
WshShell.Run(xPing, 0, -1);
Исключение
КонецПопытки;
КонецПроцедуры
Показатьвзято из этой работы: .
при задержке не грузит процессор (как это получается в цикле) и
время задержки - с точностью до миллисекунды.
18290 а расход 18290.25 и вот так копейки лезут везде причем смотрю в документе реализация стоят цифры как в расходе ,реализация зачетом аванса идет
ICASE(Жур.IDDocDef = $ВидДокумента.Реализация, 'Реализация',
Жур.IDDocDef = $ВидДокумента.ВозвратОтПокупателя, 'Возврат от покупателя',
'Непредусмотренный вид') + ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')' as ДокНаименование
Рег.sp2194 as Фирма,
Рег.sp2195 as Договор,
ICASE(Жур.IDDocDef = ' X3', 'Реализация'+ ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')',
Жур.IDDocDef = ' FI', 'Возврат от покупателя'+ ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')',
Жур.IDDocDef = ' YL', 'Реализация розница'+ ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')',
Жур.IDDocDef = ' O4', 'Отчет комитенту'+ ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')',
Жур.IDDocDef = ' DA', 'ВводОстатковПокупателя'+ ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')',
Жур.IDDocDef = ' R2', 'Приходный кассовый ордер'+ ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')',
Жур.IDDocDef = ' L0', 'Приходный2 кассовый ордер'+ ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')',
'Непредусмотренный вид') as КредДокумент,
Max(Жур.date) as ДатаДок ,
SUM(IIF(Рег.debkred = 1,0,1)*Рег.sp2201) as Приход,
SUM(IIF(Рег.debkred = 1,0,Рег.sp2199)) as ПриходВ,
SUM(IIF(Рег.debkred = 1,1,0)*Рег.sp2201) as Расход,
SUM(IIF(Рег.debkred = 1,Рег.sp2199,0)) as РасходВ
FR OM
ra2207 as Рег
Left JOIN sc331 as спрФирмы ON спрФирмы.ID=Рег.sp2194
INNER JOIN
1SJOURN as Жур ON Рег.IDDOC = Жур.IDDOC
WHERE
Жур.DATE BETWEEN {d '2000-01-01'} AND {d '2013-10-29'}
AND спрФирмы.descr= 'Фирма ООО'
and Жур.IDDocDef <> ' DA'
GROUP BY
Рег.sp2194,
Рег.sp2195,
ICASE(Жур.IDDocDef = ' X3', 'Реализация'+ ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')',
Жур.IDDocDef = ' FI', 'Возврат от покупателя'+ ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')',
Жур.IDDocDef = ' YL', 'Реализация розница'+ ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')',
Жур.IDDocDef = ' O4', 'Отчет комитенту'+ ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')',
Жур.IDDocDef = ' DA', 'ВводОстатковПокупателя'+ ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')',
Жур.IDDocDef = ' R2', 'Приходный кассовый ордер'+ ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')',
Жур.IDDocDef = ' L0', 'Приходный2 кассовый ордер'+ ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')',
'Непредусмотренный вид')
***
SEL ECT
TMP.Фирма as Фирма,
TMP.Договор as Договор,
TMP.КредДокумент as КредДокумент,
Max(TMP.ДатаДок) as ДатаДок ,
SUM(TMP.Приход) as Приход,
SUM(TMP.ПриходВ) as ПриходВ,
SUM(TMP.Расход) as Расход,
SUM(TMP.РасходВ) as РасходВ
FROM
(SELECT
Рег.sp2194 as Фирма,
Рег.sp2195 as Договор,
ICASE(Жур.IDDocDef = ' X3', 'Реализация',
Жур.IDDocDef = ' FI', 'Возврат от покупателя',
Жур.IDDocDef = ' YL', 'Реализация розница',
Жур.IDDocDef = ' O4', 'Отчет комитенту',
Жур.IDDocDef = ' DA', 'ВводОстатковПокупателя',
Жур.IDDocDef = ' R2', 'Приходный кассовый ордер',
Жур.IDDocDef = ' L0', 'Приходный2 кассовый ордер',
'Непредусмотренный вид') + ' № ' + Жур.docno + ' (' + DTOC(Жур.date) + ')' as КредДокумент,
Жур.date as ДатаДок ,
IIF(Рег.debkred = 1,0,1)*Рег.sp2201 as Приход,
IIF(Рег.debkred = 1,0,Рег.sp2199) as ПриходВ,
IIF(Рег.debkred = 1,1,0)*Рег.sp2201 as Расход,
IIF(Рег.debkred = 1,Рег.sp2199,0) as РасходВ
FR OM
ra2207 as Рег
Left JOIN sc331 as спрФирмы ON спрФирмы.ID=Рег.sp2194
INNER JOIN
1SJOURN as Жур ON Рег.IDDOC = Жур.IDDOC
WH ERE
Жур.DATE BETWEEN {d '2000-01-01'} AND {d '2013-10-29'}
AND спрФирмы.descr= 'Фирма ООО')
and Жур.IDDocDef <> ' DA'
) as TMP
GROUP BY
TMP.Фирма,
TMP.Договор,
TMP.КредДокумент
***
foxpro, похоже не умеет "группировать" в явном виде по вычисляемым выражениям.
Физически внутренние идентификаторы таблиц и их соответствие с именами объектов конфигурации
прописывается в текстовом файле 1Cv7.dd (для DBF) или 1Cv7.dds (для SQL).
вот фрагмент файла 1Cv7.dd:
*****
#============================================================
#==TABLE no 120 : Документ Реализация
# Name |Descr |Type[A/S/U]|DBTableName|ReUsable
T=DH1611 |Документ Реализация |A |DH1611 |1
#-----Fields-------
# Name |Descr |Type|Length|Precision
F=IDDOC |ID Document's |C |9 |0
F=SP3338 |(P)КодОперации |C |9 |0
F=SP1587 |(P)ДокОснование |C |13 |0
F=SP1593 |(P)Склад |C |9 |0
F=SP1583 |(P)Контрагент |C |9 |0
F=SP1584 |(P)Договор |C |9 |0
F=SP1585 |(P)Валюта |C |9 |0
F=SP1586 |(P)Курс |N |11 |4
F=SP8602 |(P)Кратность |N |8 |0
F=SP1589 |(P)УчитыватьНДС |N |2 |0
F=SP1590 |(P)СуммаВклНДС |N |2 |0
F=SP1591 |(P)УчитыватьНП |N |2 |0
F=SP1592 |(P)СуммаВклНП |N |2 |0
F=SP1595 |(P)ТипЦен |C |9 |0
F=SP1596 |(P)Скидка |C |9 |0
F=SP1594 |(P)СуммаВзаиморасчет|N |16 |2
F=SP1588 |(P)ДатаОплаты |D |8 |0
F=SP7550 |(P)ФлагСвертки |N |2 |0
F=SP1604 |(P)Сумма |N |16 |2
F=SP1605 |(P)СуммаНДС |N |16 |2
F=SP1606 |(P)СуммаНП |N |16 |2
#----Indexes------
# Name |Descr |Unique|Indexed fields |DBName
I=ID |of IDDOC |0 |IDDOC |ID
#
*****
здесь 1611 - внутренний идентификатор документа "Реализация" - в десятичном представлении.
В используемом для хранения в таблицах dbf это будет ' 18R'.
Если вдруг не знаешь - есть еще ВК .
Сделана для выполнения прямых запросов в DBF, используя другие технологии доступа к данным.
Там есть две встроенные функции:
Функция str2id
Синтаксис: str2id(СтрИД)
Параметры:
СтрИД: Строка представляющая число в 36ричной записи
Возвращает: Целое число.
Описание: Преобразует строку - запись числа в 36ричном формате в целое число
Функция id2str
Синтаксис: id2str(ИД, чДлинаСтроки)
Параметры:
ИД: Преобразуемое число
чДлинаСтроки - Необходимая длина возвращаемой строки
Возвращает: Строку заданной длины.
Описание: Преобразует целое число в строку - запись числа в 36ричном формате.
Длина строки устанавливается равной заданной длине, число выравнивается по правому краю, с заполнением пустого места пробелами.
ну в 8-ке это, как я понимаю, можно решить при желании.
У объектов "ПолеВвода", "ПолеТекстовогоДокумента" и прочих
есть методы:
ПолеТекстовогоДокумента (TextDocumentField)
ПолучитьГраницыВыделения (GetTextSelectionBounds)
Синтаксис:
ПолучитьГраницыВыделения(<НачалоСтроки>, <НачалоКолонки>, <КонецСтроки>, <КонецКолонки>)
Параметры:
<НачалоСтроки> (обязательный)
Тип: Число.
Номер строки начала выделения.
<НачалоКолонки> (обязательный)
Тип: Число.
Номер колонки начала выделения.
<КонецСтроки> (обязательный)
Тип: Число.
Номер строки конца выделения.
<КонецКолонки> (обязательный)
Тип: Число.
Номер колонки конца выделения.
Описание:
Получает границы выделенной области текста.
Возвращает позицию курсора.
ПолеТекстовогоДокумента (TextDocumentField)
УстановитьГраницыВыделения (SetTextSelectionBounds)
Вариант синтаксиса: По позициям начала и конца выделения в тексте
Синтаксис:
УстановитьГраницыВыделения(<НачальнаяПозиция>, <КонечнаяПозиция>)
Параметры:
<НачальнаяПозиция> (обязательный)
Тип: Число.
Позиция начала выделения в тексте.
<КонечнаяПозиция> (обязательный)
Тип: Число.
Конечная позиция выделения в тексте.
Вариант синтаксиса: По номерам строк и колонок начала и конца выделения в тексте
Синтаксис:
УстановитьГраницыВыделения(<НачалоСтроки>, <НачалоКолонки>, <КонецСтроки>, <КонецКолонки>)
Параметры:
<НачалоСтроки> (обязательный)
Тип: Число.
Номер строки начала выделения.
<НачалоКолонки> (обязательный)
Тип: Число.
Номер колонки начала выделения.
<КонецСтроки> (обязательный)
Тип: Число.
Номер строки конца выделения.
<КонецКолонки> (обязательный)
Тип: Число.
Номер колонки конца выделениия.
Описание:
Устанавливает границы выделенной области текста.
проблема может состоять в том, что может не оказаться событий,
в которых можно запоминать и восстанавливать курсор в поле ввода.
Это, пожалуй, главная исходная интерфейсная фишка в 1CQА.
***
В файлах поставки есть архив FormEx1CPP.rar
в нем есть файлы:
1.КОП_ОбщиеФормаПривязка.ert - обработка-исходник класса
2.Defcls.ert - обработка с объявлениями классов для встраивания в конфигурацию
3.Defcls.prm - файл с объявлениями классов при их подключении из внешних файлов
***
можно включить все в конфигурацию базы
- просто добавляешь обработки
КОП_ОбщиеФормаПривязка.ert и Defcls.ertв конфигурацию.
можно загружать классы и из внешних файлов
- в этом случае нужно скопировать
КОП_ОбщиеФормаПривязка.ert и Defcls.prm
в каталог базы.
я предпочитаю первый вариант.
в классах нет ничего особо сложного.
открывай КОП_ОбщиеФормаПривязка.ert и
по аналогии ваяй что-нибудь свое
...
есть правда тонкости с подключением класса
в Defcls.ert (Defcls.prm),
но этим тоже все достаточно прозрачно.
***
ну конечно полезны будут знания базовых понятий ООП
- которое 1С-цы почему-то ненавидят.
а также полезно будет полазить в документации 1cpp
- чего страшно не любишь ты, любезный друг.
;)
хотя эти номера очевидно также хранятся и в файле 1Cv7.md,
поскольку при изменении порядка объектов в конфигурации и добавления новых объектов
внутренние номера существующих объектов не изменяются
- даже после загрузки измененного md-ника в пустую базу.
***
в общем тебе, sss999, повезло
...
если бы было бы не так - то с разными базами могли быть приколы, которых я опасался.
насколько я знаю обратная операция метаимени $ВидДокумента.ХХХХ
поддерживается только при типизации
колонок результата запроса при выгрузке в таблицу значений (и то не для всех версии 1cpp).
Об этом я говорил в посте (242).
---
Есть такой вариант (не очень удобный и не самый легкий):
1. по метаданным сгенерить заготовку коррелированного подзапроса
с шаблонами подстановок имен полей,
возвращающий по значению поля IDDocDef
текстовое представление вида документа.
2. в текст исходного запроса программно вставлять
строку этого коррелированный подзапроса
с заменой шаблонов подстановок имен полей на нужные.
Я делал другие вещи подобным образом под SQL, а под DBF - не проверял.
Можно надеяться, что foxpro поддерживает коррелированные подзапросы
(1С-ные запросы, например, этого не умеют).
думаю тебя заинтересует вот эта работа:
там предлагается класс под 1cpp,
выполняющий прямые запросы в 1с-7.7 с дополнительными возможностями.
документация класса во вложении (если нет стартманей)
:)
"прямой", то он "прямой".
Но ты сам его как то раз назвал "кривым".
;)
Однако запаришься пока напишешь подзапрос
виртуальной таблицы РегистрОстаткиОбороты.
А в DBF это приходится делать самому.
Класс же тебе вместо макроподстановки ВТ вставит
в итоговый текст запроса нужный подзапрос.
Кроме того, класс еще умеет имитировать ВТ бухгалтерских итогов.
Этих ВТ таблиц вообще нет в 1сpp.
Такая типизация
***
Жур.IDDOCDEF as [ВидДок$ВидДокумента],
Жур.IDDOCDEF as [ВидДок$ВидДокументаПредставление],
***
оказывается работает только для запросов через ODBC с помощью объекта ODBCRecordSet
ну еще наверное для прямых запросов через ВК 1sqlite.dll
к сожалению с помощью ODBCRecordSet в DBF у меня не получилось выполнять прямые запросы.
$Рег.Фирма 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 РасходВ
FROM
$Регистр.Покупатели as Рег
Left JOIN sc331 as спрФирмы ON спрФирмы.ID=$Рег.Фирма
INNER JOIN
1SJOURN as Жур ON Рег.IDDOC = Жур.IDDOC
GROUP BY
$Рег.Фирма,
$Рег.Договор,
$Рег.КредДокумент
ну что ж сказать, прикольно - наверное глюк какой-то у провайдера данных.
возможно это связано с какими-то неявными преобразованиями типов:
foxpro пытается из каких-то соображений преобразовать
значение поля $Рег.СуммаРуб, имеющее тип numeric к типу int.
можно еще и так попробовать:
SUM(IIF(Рег.debkred <> 1,0,1)*$Рег.СуммаРуб) as Приход2,
или так (если порядок следования имеет значение):
SUM($Рег.СуммаРуб*IIF(Рег.debkred <> 1,0,1)) as Приход2,
а еще можно конвертнуть базу в SQL формат, и проверить что будет там
(придется правда все запросы переписывать).
я смотрю ты тоже поупражнялся с .
занятие довольно популярное
...
и я тоже не смог удержаться от соблазна
:)
моя консоль - составная часть функционала
Эта консоль также может выполнять "прямые" запросы к базе через ADO.
Может работать и без подсистемы как внешняя обработка,
но с ограничением функциональности:
- не будут работать запросы к источникам данных ADO.
- не будут работать продвинутые возможности просмотра табличных объектов,
обеспечиваемых подсистемой , которая включена в состав "COMExchange".
На счет конструктора прямых запросов:
1. Работает корректно только для баз SQL
2. работа конструктора обеспечивается ВК qryConsole.dll,
эта внешняя компонента не входит в комплект поставки, но
ее можно скачать в интернете в свободном доступе (смотри ниже).
4) При большом желании (для редактирования запроса в диалоге конструктора) требуется наличие внешней компоненты qryConsole.dll(автор Ivan T Berezdetsky). Обработка при открытии пытается ее загрузить (так же как 1CPP). Если загрузить не удается, то соответствующие элементы управления в обработке становятся недоступными.
Установочный дистрибутив и обсуждение внешней компоненты - на форуме: . Для работы ВК qryConsole.dll обязательна установка Office web components (OWC11). Иначе обработка будет вас малоприятно ругать при открытии (беда устраняется или установкой OWC11, или удалением/переименованием файла библиотеки – чтоб вообще не грузилась).
консоль может быть открыта в режиме "подбора выборки данных"
(примерно как типовая обработка UChoice):
открываешь ее из другой обработки,
открываешь нужный файл запроса,
выполняешь запрос и его результат возвращаешь в обработку
для каких либо дальнейших действий.
***
примеры использования:
в общем в этом случае запрос
выполняется вот этим методом объекта ODBCRecordSet:
Синтаксис: ВыполнитьXML([ТекстЗапроса], [ОбъектПриемник])
Параметры:
ТекстЗапроса - тип: Строка. Текст запроса, если пустая строка-запрос считается параметризированным. Необязателен, по умолчанию - пустая строка.
ОбъектПриемник - тип: BinaryData. Объект для получения результата запроса. Необязателен, по умолчанию - пустое значение.
Возвращает: тип: Строка, ПустоеЗначение. Результат запроса или, если передан объект приемник - возвращается ПустоеЗначение.
Описание: выполняет запрос и получает результат как XML данные. Если вторым параметром передан объект BinaryData, то результат записывается в этот объект (с учетом текущей кодировки и текущей позиции в файле), при этом возвращаемое значение метода не определено, если второй параметр - пустое значение, метод возвращает строку - результат запроса.
а возвращаемую запросом XML-строку прописывает в "результат запроса"
вообще метод ODBCRecordSet::ВыполнитьСкалярный()
довольно замороченный - читай повнимательней мануал.
например,
если запрос возвращает одну строку с несколькими колонками,
то метод вернет объект "Структура" (тот что поставляет ВК 1cpp.dll),
заполненную значениями колонок из строки.
А этот объект, как назло, никак не отображается
в таблице значений результата в консоли,
поэтому и кажется, что метод ничего не возвращает.
По большей части этот метод предназначен для получения
скалярного значения (не объекта) -
- в результате запроса должна быть одна строка и одна колонка.
этот параметр имеет отношение к особенностям обмена данными между
SQL сервером и клиентским приложением во время выполнения запроса
и перебора строк его результата:
ODBCRecordSet :: УстРазмерМножестваСтрок / SetRowsetSize
Синтаксис: УстРазмерМножестваСтрок(чРазмер)
Параметры:
чРазмер - тип: Число. Размер множества строк.
Описание: устанавливает размер блока выборки (в виде количества строк), который будет получен драйвером ODBC за одно обращение в к источнику данных. Уменьшает количество обращений к источнику, за счет получение получения больших порций данных. Использовать данный метод имеет смысл только до вызова метода Открыть
этот параметр может влиять только на скорость выполнения запроса.
честно говоря,
примочки с планом выполнения я позаимствовал
в одной из версии консоли на форуме www.1cpp.ru.
об этом предмете я имею самое общее представление -
- знаю что такое и для чего оно, но не более того (на практике не использовал).
думаю что Ёпрст может нам много интересного рассказать об этом
;)))
единственное что могу сказать,
что план выполнения -
это своего рода алгоритм действий с физическими таблицами данных,
которое сервер будет осуществлять при выполнении запроса.
используется при оптимизации запросов и индексов таблиц.
в консоли выводится суррогат графической диаграммы плана выполнения.
из "результата запроса" удаляются колонки с дополнительными сведениями,
вывод которых бы портил внешний вид этой "диаграммы".
еще вопрос про 4)Добавлены служебные типы параметры запроса СписокСсылок9, СписокСсылок13 и ИерархияСсылок9. совсем не понял различие между ними. понял что отличие от обычных значений объектов это списки со значениями, но как их в запросах использовать через #? нужен пример, если нетрудно.
например, сделал список значений перечисления ТипНоменклатуры, а дальше ступр.
и когда открывается форма с редактированием списка параметра, понятно, что первая вкладка - это собственно выбор элементов/объектов для списка, а вторая вкладка "Отбор по значениям реквизитов" зачем?
СписокСсылок9 -
- cписок значений типа "Справочник", "Документ", "Счет" определенного вида
СписокСсылок13 -
- список значений типа "Справочник", "Документ", "Счет" уже НЕ-определенного вида
ИерархияСсылок9 -
- тоже самое, что СписокСсылок9, но только в список также
включаются все подчиненные элементы из групп справочника, выбранных в списке.
обрабатываются эти параметры особым образом.
Для СписокСсылок9 и ИерархияСсылок9 выбранные списки значений
фактически укладывается во временную таблицу с именем #<ИмяПараметра>
с помощью метода ODBCRecordSet :: УложитьСписокОбъектов()
ODBCRecordSet :: УложитьСписокОбъектов / PutObjectList
Синтаксис: УложитьСписокОбъектов(Список, ИмяТаблицы, [ВидЭлементов])
Параметры:
Список - тип: СписокЗначений, Справочник, Счет. Объект, содержание которого будет отправляться на сервер. Если передан список значений, во врем. таблицу попадает содержимое списка. Допустимо также передавать группу справочника, элемент справочника, группу счетов, счет - в этом случае во временную таблицу поступает переданное значение, однако если указан ВидЭлементов (вид справочника, или план счетов), то будет попытка включить в таблицу все подчененные элементы.
ИмяТаблицы - тип: Строка. Имя временной таблицы.
ВидЭлементов - тип: Строка. Вид справочника для иерархического включения элементов или вид плана счетов для иерархического включения счетов. Если параметр не указан, иерархического включения не происходит.
Описание: сохраняет список внутренних идентификаторов объектов во временной таблице MS SQL. Идентификаторы объектов из списка сохраняются во временной таблице в поле val char(9). Имя таблицы должно начинаться с символа "#".
Если указан вид ВидЭлементов - идентификатор иерархического справочника, то таблица будет содержать элементы, иерархически принадлежащие группам переданным в списке. (Подобно оператору "в" стандартного языка запросов 1С.)
Замечание: метод допустимо применять только для источника данных Microsoft SQL Server.
Для СписокСсылок13 используется другой метод:
ODBCRecordSet :: УложитьСписокОбъектов13 / PutObjectList13
Синтаксис: УложитьСписокОбъектов13(Список, ИмяТаблицы)
Параметры:
Список - тип: СписокЗначений, Справочник, Счет. Объект, содержание которого будет отправляться на сервер. Если передан список значений, во врем. таблицу попадает содержимое списка.
ИмяТаблицы - тип: Строка. Имя временной таблицы.
Описание: сохраняет список объектов во временной таблице MS SQL. Идентификаторы объектов из списка сохраняются во временной таблице. Таблица имеет единственное поле val char(13). Имя таблицы должно начинаться с символа "#".
Просто #<ИмяПараметра>.
Но надо иметь ввиду, что это фактически имя временной таблицы.
Пример:
FR OM
$Справочник.Контрагенты AS Спр
WH ERE
Спр.ID IN (SELECT Val FR OM #СписокКонтрагентов)
здесь СписокКонтрагентов параметр типа
СписокСсылок9 или ИерархияСсылок9 типа-вида Справочник.Контрагенты.
возможно ты спрашиваешь о том, как редактируются списки значений
СписокСсылок9
СписокСсылок13
ИерархияСсылок9
***
Эти списки редактируются в модальном режиме
в подправленной обработке UChoice
(идет в полном комплекте поставки)
остатки и обороты по регистрам для SQL-базы
легко получаются с помощью виртуальных таблиц (смотри описаловку к 1cpp.dll).
а вот с бухгалтерскими итогами и в случае баз DBF - вилы!
все запросы по остаткам и оборотам приходится "рисовать" руками.
как я понял тебе нужны бухгалтерские итоги.
К сожалению разработчики 1cpp.dll не уделили особого внимания бухгалтерскому учету.
Нет соответствующих виртуальных таблиц остатков-оборотов по бухг.счетам.
Потому приходится городить их самому, используя следующие таблицы:
_1SACCS - счета
_1SENTRY - проводки
_1SBKTTLC - обороты между счетами
_1SBKTTL - остатки по счетам в разрезе субконто
Выкладываю смотрелку структуры таблиц баз 1С-7.7 (в файлах 1Cv7.DD / 1Cv7.DDS)
Она меня часто выручала
Период С НачГода по ДатаОкончания;
Без итогов;
Валюта = Документ.Приходная.Валюта,Документ.ПриходнаяМатериалы.Валюта;
ДатаДок = Документ.Приходная.ДатаДок,Документ.ПриходнаяМатериалы.ДатаДок;
ТНВЭД = Документ.Приходная.ТНВЭД,Документ.ПриходнаяМатериалы.ТНВЭД;
Количество = Документ.Приходная.Количество,Документ.ПриходнаяМатериалы.Количество;
Единица = Документ.Приходная.Единица,Документ.ПриходнаяМатериалы.Единица;
Коэффициент = Документ.Приходная.Единица.Коэффициент,Документ.ПриходнаяМатериалы.Единица.Коэффициент;
СуммаСтроки = Документ.Приходная.Сумма,Документ.ПриходнаяМатериалы.Сумма;
Функция Объем = Сумма(Количество*Коэффициент) Когда (ДатаДок >= ДатаНачала);
Функция ОбъемСНачалаГода = Сумма(Количество*Коэффициент);
Функция Сумма = Сумма(Пересчет(СуммаСтроки,Валюта,БазВалюта,ДатаДок)) Когда (ДатаДок >= ДатаНачала);
Функция СуммаСНачалаГода = Сумма(Пересчет(СуммаСтроки,Валюта,БазВалюта,ДатаДок));
Условие(Валюта<>ВалютаРубли);
Группировка ТНВЭД Без групп; ПоказатьState 42000, native 170, message [Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: Incorrect syntax near 'НачГода'.
Обработка не работает с таким форматом?
если нужен просто конструктор запросов в консоли и устроят прямые запросы к базе,
то эта консоль умеет работать с конструктором прямых запросов,
поставляемым ВК qryConsole.dll:
4) При большом желании (для редактирования запроса в диалоге конструктора) требуется наличие внешней компоненты qryConsole.dll(автор Ivan T Berezdetsky). Обработка при открытии пытается ее загрузить (так же как 1CPP). Если загрузить не удается, то соответствующие элементы управления в обработке становятся недоступными.
Установочный дистрибутив и обсуждение внешней компоненты - на форуме: . Для работы ВК qryConsole.dll обязательна установка Office web components (OWC11). Иначе обработка будет вас малоприятно ругать при открытии (беда устраняется или установкой OWC11, или удалением/переименованием файла библиотеки – чтоб вообще не грузилась).
***
к сожалению любую возможную консоль запросов 1с-7.7
в принципе нельзя сделать "полностью" универсальной
как в 1с-8.х.
поскольку в запросах 1с-7.7 нет параметров запроса как таковых.
вместо них используются имена переменные контекста выполнения.
можно конечно навтыкать реквизитов диалога соотвествующих типов
для часто встречаемых параметров - но это конечно уже не то.
PS
PS
конечно может быть есть какая-нибудь могучая внешняя внешняя компонента
для конструктора штатных запросов 1с-7.7...но что-то я сомневаюсь.
***
ну а проблема с произвольными именами параметров запроса -
- в принципе не решаемая.
в этом конструкторе (который сделан на подобие конструктора запросов 1С-8.х)
у виртуальных таблиц в списке выбранных таблиц сверху доступна кнопочка ее свойств.
при нажатии на эту кнопочку открывается диалог,
в котором и нужно ручками указать нужные выражения
(с использованием имен параметров запроса)
для параметров виртуальной таблицы (включая период).
Список параметров можно потом заполнить по тексту запроса,
а не заполнять его руками предварительно.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 98982
Создание 20.11.11 03:17
Обновление 17.12.11 14:39
Просмотры 308688
Загрузки 434
Рейтинг
98
Комментарии 383
Код открыт Не указано
Рубрики Инструментарий разработчика
Кому
Системный администратор
,
Разработчик
Тип файла Внешняя обработка (ert,epf)
Платформа
1С:Предприятие 7.7
,
Оперативный учет 7.7
,
Бухгалтерский учет 7.7
,
Расчет 7.7
Конфигурация 1C77
Операционная система Windows
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)