SQL запросы (версия 3.xx)/1C: различия между версиями

Материал из Call Office Wiki
Перейти к навигации Перейти к поиску
Строка 159: Строка 159:


     var Org;
     var Org;
     while (Select.Следующий () === true) {
     if (Select.Следующий () === true) {
       Org = Select.Значение;
       Org = Select.Значение;
     }
     }
Строка 182: Строка 182:
     var GetCurrentDateForQuery = function () {
     var GetCurrentDateForQuery = function () {


                          var Dt = new Date;
                                    var Dt = new Date;
                          var TwoChar = function (Num) {return Num < 10 ? '0' + Num : Num;}
                                    var TwoChar = function (Num) {return Num < 10 ? '0' + Num : Num;}
 
                                    return '' + Dt.getFullYear () + ','+
                                          TwoChar (Dt.getMonth  () + 1) + ','+
                                          TwoChar (Dt.getDate    ()) + ',' +
                                          TwoChar (Dt.getHours  ()) + ','+
                                          TwoChar (Dt.getMinutes ()) + ','+
                                          TwoChar (Dt.getSeconds ());
                                };


                          return '' + Dt.getFullYear () + ','+
   var Query = Connection.NewObject ('Запрос');
                                      TwoChar (Dt.getMonth  () + 1) + ','+
                                      TwoChar (Dt.getDate   ()) + ',' +
                                      TwoChar (Dt.getHours  ()) + ','+
                                      TwoChar (Dt.getMinutes ()) + ','+
                                      TwoChar (Dt.getSeconds ());
                        };
var Query = Connection.NewObject ('Запрос');


Query.Текст = "ВЫБРАТЬ \
  Query.Текст = "ВЫБРАТЬ КурсыВалютСрезПоследних.Курс \
    КурсыВалютСрезПоследних.Курс \
                      ИЗ РегистрСведений.КурсыВалют.СрезПоследних(ДАТАВРЕМЯ("+GetCurrentDateForQuery()+"), ) КАК КурсыВалютСрезПоследних";
ИЗ \
    РегистрСведений.КурсыВалют.СрезПоследних(ДАТАВРЕМЯ("+GetCurrentDateForQuery()+"), ) КАК КурсыВалютСрезПоследних";


return Query.Выполнить ();
  return Query.Выполнить ();
  }
  }


Строка 224: Строка 223:
                                       TwoChar (Dt.getSeconds ());
                                       TwoChar (Dt.getSeconds ());
                         };
                         };
var Query = Connection.NewObject ('Запрос');


Query.Текст =  'ВЫБРАТЬ \
  var Query = Connection.NewObject ('Запрос');
  ПоказанияПриборовУчетаАбонентов.ВидПоказаний.Наименование КАК Наименование, \
 
  ПоказанияПриборовУчетаАбонентов.ДатаОперации КАК ДатаПоказаний, \
  Query.Текст =  'ВЫБРАТЬ ПоказанияПриборовУчетаАбонентов.ВидПоказаний.Наименование КАК Наименование, \
  ПоказанияПриборовУчетаАбонентов.ВидПоказаний КАК ВидПоказаний \
                          ПоказанияПриборовУчетаАбонентов.ДатаОперации КАК ДатаПоказаний, \
ИЗ \
                          ПоказанияПриборовУчетаАбонентов.ВидПоказаний КАК ВидПоказаний \
  Документ.ПоказанияПриборовУчетаАбонентов КАК ПоказанияПриборовУчетаАбонентов \
                        ИЗ Документ.ПоказанияПриборовУчетаАбонентов КАК ПоказанияПриборовУчетаАбонентов \
ГДЕ\
                      ГДЕ ПоказанияПриборовУчетаАбонентов.ВидПоказаний.Наименование = "по Телефону"';
ПоказанияПриборовУчетаАбонентов.ВидПоказаний.Наименование = "по Телефону"';
 
var Select = Query.Выполнить ().Выбрать ();
  var Select = Query.Выполнить ().Выбрать ();


var Bd = Connection.NewObject ('Запрос');
  var Bd = Connection.NewObject ('Запрос');


Bd.Текст = ' ВЫБРАТЬ \
Bd.Текст = ' ВЫБРАТЬ \
Строка 245: Строка 243:
ГДЕ\
ГДЕ\
   ПоказанияПриборовУчетаАбонентов.НаселенныйПункт.Наименование = "[НаселенныйПункт]"';
   ПоказанияПриборовУчетаАбонентов.НаселенныйПункт.Наименование = "[НаселенныйПункт]"';
var Set = Bd.Выполнить ().Выбрать ();
var Set = Bd.Выполнить ().Выбрать ();
    
    

Версия 11:44, 8 июля 2020

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

Поддерживаются SQL - операторы:

  • select или ВЫБРАТЬ - выборка данных. В списке полей можно указать только * - все поля. Пример: ВЫБРАТЬ ПЕРВЫЕ 10 * ИЗ Справочник.Контрагенты
    • where или ГДЕ - позволяет указать условие выборки. Пример: select * from Справочник.Контрагенты where Наименование = "Тест"
  • insert - вставка данных, позволяет указать список полей и константы значений, выражения не поддерживаются. Пример: insert into Справочники.Контрагенты (Наименование) values ("Тест")
  • update - изменение данных, позволяет указать список изменяемых полей и условие отбора. Пример: update Справочники.Контрагенты set Комментарий = 5 where Наименование = 'Тест'
  • delete - изменение данных, позволяет указать список изменяемых полей и условие отбора. Пример: delete from Справочник.Контрагенты where Наименование = "Тест"

Помимо этого SQL-запросы к этому источнику данных могут содержать комментарии в виде /* */ и содержать несколько запросов разделенных символами // на новой строке.

Пример SQL-запросов 1C на выборку данных

SQL-запросы на выборку данных полностью аналогичны запросам Новый Запрос на языке 1C. Например, запрос на выборку контрагентов с номерами телефонов выглядит так:

ВЫБРАТЬ * 
     ИЗ Справочник.Контрагенты КАК Контрагенты
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК Телефон ПО (Телефон.Объект = Контрагенты.Ссылка) 
                                                                           И (Телефон.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон))
                                                                           И (Телефон.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ТелефонКонтрагента))
   ГДЕ Телефон.Представление ЕСТЬ НЕ null 
УПОРЯДОЧИТЬ ПО Контрагенты.Наименование

Или на привычном языке SQL этот же запрос выглядит так:

select * 
  from Справочник.Контрагенты AS Контрагенты
       left join РегистрСведений.КонтактнаяИнформация as Телефон on (Телефон.Объект = Контрагенты.Ссылка)
                                                                and (Телефон.Тип = VALUE(Перечисление.ТипыКонтактнойИнформации.Телефон))
                                                                and (Телефон.Вид = VALUE(Справочник.ВидыКонтактнойИнформации.ТелефонКонтрагента))
 where Телефон.Представление is not null 
order by Контрагенты.Наименование

Более подробно о том как составлять запросы на выборку данных 1C можно посмотреть здесь.

Пример SQL-запросов 1C на изменение данных

SQL-запросы на изменение данных не поддерживаются 1C, поэтому функционал таких запросов эмулируется средой Call Office. Следует учитывать, что из-за особенностей 1C, имена таблиц в запросах на выборку данных выглядят одним образом (например, Справочник.Контрагенты), а при работе на изменение данных - другим (например, Справочники.Контрагенты).

Поэтому, SQL-запрос на запись результатов звонка в поле Комментарий объекта Контрагенты выглядит так:

update Справочники.Контрагенты
   set Комментарий = [ColumnResult]
 where Наименование = '[Наименование]'

Использование функций для доступа к данным 1C

Если возможностей SQL-запросов недостаточно, то вы можете работать напрямую с функциями объектов 1C на языке javascript. Такие функции необходимо заключать между символами /! и !/. Например, следующая функция найдет контрагента с кодом 000000001, запишет 11455 в его ИНН:

 /!
 function (Connection) {

    var Find = Connection.Справочники.Контрагенты.НайтиПоКоду ('000000001');

    if (Find != Connection.Справочники.Контрагенты.ПустаяСсылка ()) {

       var Contractor = Find.ПолучитьОбъект ();
       Contractor.ИНН =  11455;
       Contractor.Записать ();

    } else alert ('Контрагент не найден !');

    return null;
 }
 !/
 

А эта выберет первые 10 контрагентов:

 /!
 function (Connection) {

    var Query = Connection.NewObject ('Query');
    Query.text = "ВЫБРАТЬ ПЕРВЫЕ 10 * ИЗ Справочник.Контрагенты";

    return Query.execute ();
 }
 !/
 

Вариант для записи результатов звонка:

 /!
 function (Connection) {

    var nz = Connection.РегистрыСведений.КакойтоРегистр.СоздатьНаборЗаписей();

    nz.Отбор.УИД.Установить ('[Выборка.УИД]'); // Ищем по уникальному идентификатору

    nz.Прочитать();

    if (nz.Количество() > 0) {

       var curz = nz.Получить(0);
       curz.Статус = '[ColumnResult]';

       nz.Записать ();
    }

    return null;
 }
 !/
 

В качестве параметра функции Connection передается COM-соединение с базой данных 1С.

Полезные примеры для работы с 1С

Получение текущей даты-времени для 1С, например для установки документу перед его записью:

 /!

 function (Connection) {

   var GetCurrentDate = function () {

                           var Dt = new Date;
                           var TwoChar = function (Num) {return Num < 10 ? '0' + Num : Num;}

                           return '' + Dt.getFullYear () +
                                       TwoChar (Dt.getMonth   () + 1) +
                                       TwoChar (Dt.getDate    ()) +
                                       TwoChar (Dt.getHours   ()) +
                                       TwoChar (Dt.getMinutes ()) +
                                       TwoChar (Dt.getSeconds ());
                        };

    var Doc = Connection.Документы.ИмяВашегоДокумента.СоздатьДокумент ();
    Doc.Дата = GetCurrentDate ();
    Doc.Ответственный = Connection.ПараметрыСеанса.ТекущийПользователь;      // Пользователь, через которого осуществляется подключение к 1С
    Doc.Записать ();

    return null;
 }
 !/
 

Выполнение произвольного запроса в 1С:

Примечание: для создания многострочного запроса, необходимо в конце каждой строки добавлять "\"

 /!

 function (Connection) {

    var Query = Connection.NewObject ('Запрос');

                                      // Запрос выбирает настройку "Основная организация" у пользователя, через которого осуществляется подключение к 1С

    Query.Текст = "ВЫБРАТЬ НастройкиПользователей.Значение \
                        ИЗ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей \
                       ГДЕ НастройкиПользователей.Пользователь = &Пользователь \
                         И НастройкиПользователей.Настройка = ЗНАЧЕНИЕ (ПланВидовХарактеристик.НастройкиПользователей.ОсновнаяОрганизация)";

    Query.УстановитьПараметр ("Пользователь",Connection.ПараметрыСеанса.ТекущийПользователь);

    var Select = Query.Выполнить ().Выбрать ();

    var Org;
    if (Select.Следующий () === true) {
       Org = Select.Значение;
    }

    var Doc = Connection.Документы.ИмяВашегоДокумента.СоздатьДокумент ();

    Doc.Организация = Org;
    Doc.Записать ();

    return null;
 }
 !/
 

Пример передачи в запрос текущей даты и времени.

/!

 function (Connection) {

    var GetCurrentDateForQuery = function () {

                                    var Dt = new Date;
                                    var TwoChar = function (Num) {return Num < 10 ? '0' + Num : Num;}

                                    return '' + Dt.getFullYear () + ','+
                                           TwoChar (Dt.getMonth   () + 1) + ','+
                                           TwoChar (Dt.getDate    ()) + ',' +
                                           TwoChar (Dt.getHours   ()) + ','+
                                           TwoChar (Dt.getMinutes ()) + ','+
                                           TwoChar (Dt.getSeconds ());
                                 };

   var Query = Connection.NewObject ('Запрос');

   Query.Текст = "ВЫБРАТЬ КурсыВалютСрезПоследних.Курс \
                       ИЗ РегистрСведений.КурсыВалют.СрезПоследних(ДАТАВРЕМЯ("+GetCurrentDateForQuery()+"), ) КАК КурсыВалютСрезПоследних";

   return Query.Выполнить ();
 }

!/
 

Пример запроса на запись показания прибора учета.

/!

 function (Connection) {

   var GetCurrentDate = function () {

                           var Dt = new Date;
                           var TwoChar = function (Num) {return Num < 10 ? '0' + Num : Num;}

                           return '' + Dt.getFullYear () +
                                       TwoChar (Dt.getMonth   () + 1) +
                                       TwoChar (Dt.getDate    ()) +
                                       TwoChar (Dt.getHours   ()) +
                                       TwoChar (Dt.getMinutes ()) +
                                       TwoChar (Dt.getSeconds ());
                        };

   var Query = Connection.NewObject ('Запрос');

   Query.Текст =  'ВЫБРАТЬ ПоказанияПриборовУчетаАбонентов.ВидПоказаний.Наименование КАК Наименование, \
                           ПоказанияПриборовУчетаАбонентов.ДатаОперации КАК ДатаПоказаний, \
                           ПоказанияПриборовУчетаАбонентов.ВидПоказаний КАК ВидПоказаний \
                        ИЗ Документ.ПоказанияПриборовУчетаАбонентов КАК ПоказанияПриборовУчетаАбонентов \
                       ГДЕ ПоказанияПриборовУчетаАбонентов.ВидПоказаний.Наименование = "по Телефону"';

   var Select = Query.Выполнить ().Выбрать ();

   var Bd = Connection.NewObject ('Запрос');

Bd.Текст = ' ВЫБРАТЬ \
   ПоказанияПриборовУчетаАбонентов.НаселенныйПункт.Наименование КАК НаселенныйПунктНаименование, \
   ПоказанияПриборовУчетаАбонентов.НаселенныйПункт КАК НаселенныйПункт \
ИЗ \
   Документ.ПоказанияПриборовУчетаАбонентов КАК ПоказанияПриборовУчетаАбонентов \
ГДЕ\
   ПоказанияПриборовУчетаАбонентов.НаселенныйПункт.Наименование = "[НаселенныйПункт]"';

var Set = Bd.Выполнить ().Выбрать ();
   
   var Doc = Connection.Документы.ПоказанияПриборовУчетаАбонентов.СоздатьДокумент();

      if (Select.Следующий () === true) {
         Doc.ВидПоказаний = Select.ВидПоказаний;
      }
   
      if (Set.Следующий () === true) {
         Doc.НаселенныйПункт = Set.НаселенныйПункт;
      }
  
      Doc.ДатаОперации = GetCurrentDate ();
      Doc.Дата = GetCurrentDate ();

      var Search = Doc.ПриборыУчета.Добавить();

      Search.Абонент = Connection.Справочники.Абоненты.НайтиПоКоду("[Account]");

      var Pu = Connection.Справочники.ПриборыУчета.НайтиПоНаименованию("[ПриборУчетаСсылка]");

      Search.Показания = "[Reading]";
      Search.ПриборУчета = Pu;

      Doc.Записать (Connection.РежимЗаписиДокумента.Проведение);
   return null;
}
!/
 

смотрите так же Конфигурирование 1C

Назад к SQL-запросам