Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Волшебство программирования на 1С:Предприятие 7.7 и 8.0



Волшебство программирования на 1С:Предприятие 7.7 и 8.0

Эффективное использование MSSQL с помощью ВК 1C++

Автор статьи: acsent | Редакторы: pavel_tr, BlackTiger
Последняя редакция №11 от 11.03.07 | История
URL: http://kb.mista.ru/article.php?id=86

Ключевые слова: 1C++, прямые запросы


Глава 1: Мой первый запрос


Для начала нужно научиться выполнять элементарные запросы к базе 1С непосредственно из самой программы.

Рассмотрим такой запрос:


Код = Справочник.Номенклатура.Наименование;
Наименование   = Справочник.Номенклатура.Наименование;
ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
Группировка ТекущийЭлемент;


Как известно имена таблиц и полей не совпадают с теми идентификаторами, которые мы задаем в конфигураторе (соответствия можно посмотреть в файле 1Cv7.DDS):
Справочник.Номенклатура – таблица SC433 (в разных базах это может быть разным)
Код – Code, Наименование – Descr

Запрос на TSQL будет выглядеть следующим образом:


SELECT
 СпрНом.Code as Код,
 СпрНом.Descr as Наименование
FROM
 sc433 as СпрНом


Его можно запустить в QA и увидеть полученный результат.

Теперь попробуем получить результат из 1С:

Для этого в 1С++ есть встроенный тип “ODBCRecordset”. Полный перечень методов и свойств можно увидеть в документации и в синтаксис-помощнике. Пока остановимся на методе ВыполнитьИнструкцию(Текст, ТЗ = "", ОчищатьТЗ = ""), которая возвращает результат работы запроса, переданного в параметре Текст в таблицу значений

RS = СоздатьОбъект("ODBCRecordset");
RS.УстБД1С();
ТекстЗапроса = "
|SELECT
|  СпрНом.Code as Код,
|  СпрНом.Descr as Наименование
|FROM
|  sc433 as СпрНом";

ТЗ = RS.ВыполнитьИнструкцию(ТекстЗапроса);
ТЗ.ВыбратьСтроку();

Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса = 
"//{{ЗАПРОС(НаЯзыке1С)

|Код = Справочник.Номенклатура.Код;
|Наименование = Справочник.Номенклатура.Наименование;
|ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
|Группировка ТекущийЭлемент;
|"//}}ЗАПРОС
;
Запрос.Выполнить(ТекстЗапроса);


Вот и выполнился наш первый запрос. Это конечно хорошо, но справочников в конфигурации много, смотреть каждый раз в DDS ой как не хочется, да и читать такие запросы совсем не удобно. Если использовать ADO, а не 1С++, то так и придется делать. Но скажем спасибо разработчикам 1С++, что в ней есть метапарсер имен, который сам переведет все идентификаторы объектов в их реальные имена. А делается это так:

ТекстЗапроса = "
|SELECT
|    СпрНом.Code as Код,
|    СпрНом.Descr as Наименование
|FROM
|    $Справочник.Номенклатура as СпрНом";


Заменяются следующие имена:

$Справочник.ХХХ – справочник
$Документ.ХХХ – документ
$ДокументСтроки.ХХХ – табличная часть документа
А также регистры, журналы расчетов (об этом поговорим позднее)

Немножко усложним пример. Выберем дополнительно реквизит “ТипНоменклатуры”

ТекстЗапроса = "
|SELECT
|    СпрНом.Code as Код,
|    СпрНом.Descr as Наименование,
|    $СпрНом.ТипНоменклатуры as ТипНоменклатуры
|FROM
|    $Справочник.Номенклатура as СпрНом";

ТекстЗапроса = 
"//{{ЗАПРОС(НаЯзыке1С)
|Код = Справочник.Номенклатура.Код;
|Наименование = Справочник.Номенклатура.Наименование;
|ТипНоменклатуры = Справочник.Номенклатура.ТипНоменклатуры;
|ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
|Группировка ТекущийЭлемент;";




Замечание: Чтобы избежать коллизий, всегда пользуйтесь алиасами.

Как вы уже заметили, мы не стали искать соответствий имен в DDS, а переложили эту задачу на метапарсер. Для того чтобы парсер понял, что это реквизит нужно перевести на язык SQL ставим знак $ перед именем таблицы: $Спр.ТипНоменклатуры.

Правда, не все имена метапарсер преобразовывает в поля таблиц. Есть исключения – это предопределенные имена:
Для справочников
ИД (Ссылка)        ID    
Код            Code
Наименование    Descr
Родитель        ParentID
Владелец        ParentExt
ЭтоГруппа        IsFolder
ПометкаУдаления    IsMark

Для документов
ИД (Ссылка)        IDDoc
ДатаДок        Date_Time_IDDoc
НомерДок        DocNo
ВидДок        IDDocDef



Пример: Выберем непомеченные элементы справочника “Номенклатура”, которые не являются группами

ТекстЗапроса = "
|SELECT
|    Спр.Code as Код,
|    Спр.Descr as Наименование
|FROM
|    $Справочник.Номенклатура as Спр
|WHERE
|    Спр.IsFolder = 2 AND
|    Спр.IsMark = 0";
ТекстЗапроса = 
"//{{ЗАПРОС(НаЯзыке1С)
|Обрабатывать НеПомеченныеНаУдаление;
|Код = Справочник.Номенклатура.Код;
|ТекущийЭлемент = Справочник.Номенклатура.ТекущийЭлемент;
|Наименование = Справочник.Номенклатура.Наименование;
|ВидТовара = Справочник.Номенклатура.ВидТовара;
|Группировка ТекущийЭлемент без групп;";


Для поля IsMark: 1 – Помечен на удаление, 0 – Нет.
Для IsFolder: 2 – Элемент, 1 – Группа. Это сделано для того чтобы упорядочивание по этому полю сначала выдавало группы, а затем элементы.
   
Все конечно работает, но вместо типа номенклатуры получаются какие-то буковки вида ‘   C3A ‘. Это внутренние идентификаторы объектов 1С, как они хранятся в базе. Существует несколько способов получения объектов по их внутренним идам, например с помощью функции ЗначениеВСтрокуВнутр().

Но у нас в руках такая мощная вещь – она практически все умеет делать сама:
ТекстЗапроса = "
|SELECT
|    Спр.Code as Код,
|    Спр.Descr as Наименование,
|    $Спр.ТипНоменклатуры as [ТипНоменклатуры $Перечисление.ТипНоменклатуры]
|FROM
|    $Справочник.Номенклатура as Спр";


В результате мы получим Таблицу значений, в которой будет 3 колонки: Код, Наименование и ТипНоменклатуры. В последней колонке уже будут знакомые нам названия: Товар, Услуга и др.

Общий принцип таков:

  1. Имя колонки пишется в квадратных скобочках [] и состоит из 2х частей: собственно наименования и типа значения, разделенных пробелом
  2. Типы бывают следующие:
    • $Справочник – справочник неопределенного вида
    • $Справочник.ХХХ – конкретный справочник

    • $Документ – документ неопределенного вида
    • $Документ.ХХХ – конкретный документ

    • $Перечисление.ХХХ
    • $Счет.ХХХ – счет, где ХХХ – имя плана счетов

    • $Субконто – специальный тип для бухгалтерской подсистемы
    • $Неопределенный,

    • Также есть типы $Число, $Строка, $Дата – но их можно не указывать


Замечание: Приводить нужно не к тому типу, который мы хотим получить, а к тому, который задан в конфигураторе

Работа для программистов

Вы хотите работать в компании «1-й Архитектор бизнеса»,
мы - один из лидеров 1С:Франчайзи по России.


Добрый день, уважаемые программисты.

Спасибо вам за письма с откликами и резюме.

Мы постарались ответить на все ваши вопросы и со многими договорились о встрече.

Специально для иногородних, т.к. было много вопросов: Да, мы оказываем помощь в решении жилищных вопросов.

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

Наша компания - «1-й Архитектор бизнеса» - уже 10 лет на рынке. Более чем в 30 подразделениях нашей компании работает 400 человек. На данный момент у нас 3 офиса в Москве, и мы не планируем на этом останавливаться!

Еще раз хотели бы обратить ваше внимание на те вакансии, которые мы предлагаем.

Мы всегда рады хорошим специалистами и тем, кто хочет таковыми стать.

Обратите внимание, у нас появились новые вакансии!

Итак:


Ну что, вы определились?
Мы ждем вашего звонка!
или заполните анкету на нашем сайте www.1ab.ru!
тел. (495) 937-66-35, rabota@1ab.ru


Официальный сайт рассылки - www.mista.ru
Волшебный форум -
www.forum.mista.ru
Книга знаний - www.kb.mista.ru

С уважением,
Станислав Митичкин (Волшебник)
stasmit@mail.ru



В избранное