SQL запросы (версия 3.xx)/1C: различия между версиями
Евгений (обсуждение | вклад) |
Евгений (обсуждение | вклад) |
||
| Строка 223: | Строка 223: | ||
TwoChar (Dt.getSeconds ()); | TwoChar (Dt.getSeconds ()); | ||
}; | }; | ||
var Doc = Connection.Документы.ПоказанияПриборовУчетаАбонентов.СоздатьДокумент(); | |||
var Query = Connection.NewObject ('Запрос'); | var Query = Connection.NewObject ('Запрос'); | ||
| Строка 233: | Строка 235: | ||
var Select = Query.Выполнить ().Выбрать (); | var Select = Query.Выполнить ().Выбрать (); | ||
if (Select.Следующий () === true) { | |||
Doc.ВидПоказаний = Select.ВидПоказаний; | |||
} | |||
var Bd = Connection.NewObject ('Запрос'); | var Bd = Connection.NewObject ('Запрос'); | ||
| Строка 242: | Строка 248: | ||
var Set = Bd.Выполнить ().Выбрать (); | var Set = Bd.Выполнить ().Выбрать (); | ||
if (Set.Следующий () === true) { | if (Set.Следующий () === true) { | ||
Версия 12:27, 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 Doc = Connection.Документы.ПоказанияПриборовУчетаАбонентов.СоздатьДокумент();
var Query = Connection.NewObject ('Запрос');
Query.Текст = 'ВЫБРАТЬ ПоказанияПриборовУчетаАбонентов.ВидПоказаний.Наименование КАК Наименование, \
ПоказанияПриборовУчетаАбонентов.ДатаОперации КАК ДатаПоказаний, \
ПоказанияПриборовУчетаАбонентов.ВидПоказаний КАК ВидПоказаний \
ИЗ Документ.ПоказанияПриборовУчетаАбонентов КАК ПоказанияПриборовУчетаАбонентов \
ГДЕ ПоказанияПриборовУчетаАбонентов.ВидПоказаний.Наименование = "по Телефону"';
var Select = Query.Выполнить ().Выбрать ();
if (Select.Следующий () === true) {
Doc.ВидПоказаний = Select.ВидПоказаний;
}
var Bd = Connection.NewObject ('Запрос');
Bd.Текст = 'ВЫБРАТЬ ПоказанияПриборовУчетаАбонентов.НаселенныйПункт.Наименование КАК НаселенныйПунктНаименование, \
ПоказанияПриборовУчетаАбонентов.НаселенныйПункт КАК НаселенныйПункт \
ИЗ Документ.ПоказанияПриборовУчетаАбонентов КАК ПоказанияПриборовУчетаАбонентов \
ГДЕ ПоказанияПриборовУчетаАбонентов.НаселенныйПункт.Наименование = "[НаселенныйПункт]"';
var Set = Bd.Выполнить ().Выбрать ();
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-запросам