SQL запросы (версия 3.xx)/1C: различия между версиями
Zombrine (обсуждение | вклад) |
Евгений (обсуждение | вклад) |
||
(не показано 46 промежуточных версий 4 участников) | |||
Строка 10: | Строка 10: | ||
Помимо этого SQL-запросы к этому источнику данных могут содержать комментарии в виде /* */ и содержать несколько запросов разделенных символами // на новой строке. | Помимо этого SQL-запросы к этому источнику данных могут содержать комментарии в виде /* */ и содержать несколько запросов разделенных символами // на новой строке. | ||
== Пример SQL-запросов == | == Пример SQL-запросов 1C на выборку данных == | ||
SQL-запрос на выборку | SQL-запросы на выборку данных полностью аналогичны запросам '''Новый Запрос''' на языке 1C. Например, запрос на выборку контрагентов с номерами телефонов выглядит так: | ||
ВЫБРАТЬ * ИЗ Справочник.Контрагенты КАК Контрагенты ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК Телефон ПО (Телефон.Объект = Контрагенты.Ссылка) И (Телефон.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)) И (Телефон.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ТелефонКонтрагента)) | ВЫБРАТЬ * | ||
ИЗ Справочник.Контрагенты КАК Контрагенты | |||
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КонтактнаяИнформация КАК Телефон ПО (Телефон.Объект = Контрагенты.Ссылка) | |||
И (Телефон.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)) | |||
И (Телефон.Вид = ЗНАЧЕНИЕ(Справочник.ВидыКонтактнойИнформации.ТелефонКонтрагента)) | |||
ГДЕ Телефон.Представление ЕСТЬ НЕ null | |||
УПОРЯДОЧИТЬ ПО Контрагенты.Наименование | |||
Или на привычном языке SQL этот же запрос выглядит так: | |||
select * | |||
from Справочник.Контрагенты AS Контрагенты | |||
left join РегистрСведений.КонтактнаяИнформация as Телефон on (Телефон.Объект = Контрагенты.Ссылка) | |||
and (Телефон.Тип = VALUE(Перечисление.ТипыКонтактнойИнформации.Телефон)) | |||
and (Телефон.Вид = VALUE(Справочник.ВидыКонтактнойИнформации.ТелефонКонтрагента)) | |||
where Телефон.Представление is not null | |||
order by Контрагенты.Наименование | |||
Более подробно о том как составлять запросы на выборку данных 1C можно посмотреть [http://its.1c.ru/db/metod8dev#browse:13:-1:1989:2004:2006:2019 здесь]. | |||
== Пример SQL-запросов 1C на изменение данных == | |||
SQL-запросы на изменение данных не поддерживаются 1C, поэтому функционал таких запросов эмулируется средой Call Office. Следует учитывать, что из-за особенностей 1C, имена таблиц в запросах на выборку данных выглядят одним образом (например, Справочник.Контрагенты), а при работе на изменение данных - другим (например, Справочники.Контрагенты). | |||
Поэтому, SQL-запрос на запись результатов звонка в поле Комментарий объекта Контрагенты выглядит так: | |||
update Справочники.Контрагенты | |||
set Комментарий = [ColumnResult] | |||
where Наименование = '[Наименование]' | |||
== Использование функций для доступа к данным 1C == | |||
Если возможностей SQL-запросов недостаточно, то вы можете работать напрямую с функциями объектов 1C на языке javascript. Такие функции необходимо заключать между символами '''/!''' и '''!/'''. Например, следующая функция найдет контрагента с кодом 000000001, запишет 11455 в его ИНН: | |||
<nowiki> | |||
/! | |||
function (Connection) { | |||
var Find = Connection.Справочники.Контрагенты.НайтиПоКоду ('000000001'); | |||
if (Find != Connection.Справочники.Контрагенты.ПустаяСсылка ()) { | |||
var Contractor = Find.ПолучитьОбъект (); | |||
Contractor.ИНН = 11455; | |||
Contractor.Записать (); | |||
} else alert ('Контрагент не найден !'); | |||
return null; | |||
} | |||
!/ | |||
</nowiki> | |||
А эта выберет первые 10 контрагентов: | |||
<nowiki> | |||
/! | |||
function (Connection) { | |||
var Query = Connection.NewObject ('Query'); | |||
Query.text = "ВЫБРАТЬ ПЕРВЫЕ 10 * ИЗ Справочник.Контрагенты"; | |||
return Query.execute (); | |||
} | |||
!/ | |||
</nowiki> | |||
Вариант для записи результатов звонка: | |||
<nowiki> | |||
/! | |||
function (Connection) { | |||
var nz = Connection.РегистрыСведений.КакойтоРегистр.СоздатьНаборЗаписей(); | |||
nz.Отбор.УИД.Установить ('[Выборка.УИД]'); // Ищем по уникальному идентификатору | |||
nz.Прочитать(); | |||
if (nz.Количество() > 0) { | |||
var curz = nz.Получить(0); | |||
curz.Статус = '[ColumnResult]'; | |||
nz.Записать (); | |||
} | |||
return null; | |||
} | |||
!/ | |||
</nowiki> | |||
В качестве параметра функции Connection передается COM-соединение с базой данных 1С. | |||
== Полезные примеры для работы с 1С == | |||
Получение текущей даты-времени для 1С, например для установки документу перед его записью: | |||
<nowiki> | |||
/! | |||
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; | |||
} | |||
!/ | |||
</nowiki> | |||
Выполнение произвольного запроса в 1С: | |||
Примечание: для создания многострочного запроса, необходимо в конце каждой строки добавлять "\" | |||
<nowiki> | |||
/! | |||
function (Connection) { | |||
var Query = Connection.NewObject ('Запрос'); | |||
// Запрос выбирает настройку "Основная организация" у пользователя, через которого осуществляется подключение к 1С | |||
Query.Текст = "ВЫБРАТЬ НастройкиПользователей.Значение \ | |||
ИЗ РегистрСведений.НастройкиПользователей КАК НастройкиПользователей \ | |||
ГДЕ НастройкиПользователей.Пользователь = &Пользователь \ | |||
И НастройкиПользователей.Настройка = ЗНАЧЕНИЕ (ПланВидовХарактеристик.НастройкиПользователей.ОсновнаяОрганизация)"; | |||
Query.УстановитьПараметр ("Пользователь",Connection.ПараметрыСеанса.ТекущийПользователь); | |||
var Select = Query.Выполнить ().Выбрать (); | |||
var Doc = Connection.Документы.ИмяВашегоДокумента.СоздатьДокумент (); | |||
if (Select.Следующий () === true) { | |||
Doc.Организация = Select.Значение; | |||
} | |||
Doc.Записать (); | |||
return null; | |||
} | |||
!/ | |||
</nowiki> | |||
Пример передачи в запрос текущей даты и времени. | |||
<nowiki> | |||
/! | |||
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.Выполнить (); | |||
} | |||
!/ | |||
</nowiki> | |||
Пример запроса на запись показания прибора учета. | |||
<nowiki> | |||
/! | |||
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; | |||
} | |||
!/ | |||
</nowiki> | |||
Пример многострочного кода на языке 1С | |||
<nowiki> | |||
ВЫБРАТЬ РАЗРЕШЕННЫЕ | |||
ВЫБОР | |||
КОГДА ПОДСТРОКА(УТВ_ЛицевыеСчета.Код, 7, 1) = " " | |||
ТОГДА ПОДСТРОКА(УТВ_ЛицевыеСчета.Код, 1, 6) | |||
ИНАЧЕ ПОДСТРОКА(УТВ_ЛицевыеСчета.Код, 1, 7) | |||
КОНЕЦ КАК ЛицевойСчетКод, | |||
УТВ_ЛицевыеСчета.Ссылка КАК ЛицевойСчет, | |||
УТВ_ЛицевыеСчета.Здание КАК Здание, | |||
УТВ_ЛицевыеСчета.Помещение КАК Помещение, | |||
УТВ_ЛицевыеСчета.ФизическоеЛицо КАК ФизическоеЛицо | |||
ПОМЕСТИТЬ втВыбранныеЛС | |||
ИЗ | |||
Справочник.УТВ_ЛицевыеСчета КАК УТВ_ЛицевыеСчета | |||
ГДЕ | |||
НЕ УТВ_ЛицевыеСчета.ПометкаУдаления | |||
И ВЫБОР | |||
КОГДА ПОДСТРОКА(УТВ_ЛицевыеСчета.Код, 7, 1) = " " | |||
ТОГДА ПОДСТРОКА(УТВ_ЛицевыеСчета.Код, 1, 6) | |||
ИНАЧЕ ПОДСТРОКА(УТВ_ЛицевыеСчета.Код, 1, 7) | |||
КОНЕЦ = "[Account]" | |||
; | |||
ВЫБРАТЬ РАЗРЕШЕННЫЕ | |||
ВыбранныеЛС.ЛицевойСчет КАК ЛицевойСчет, | |||
ВыбранныеЛС.ЛицевойСчетКод КАК ЛицевойСчетКод, | |||
ДействующиеСчетчики.Помещение КАК Помещение, | |||
ДействующиеСчетчики.Счетчик КАК Счетчик, | |||
ДействующиеСчетчики.ДатаОкончания КАК ДатаОкончания, | |||
ВыбранныеЛС.Здание КАК Здание | |||
ПОМЕСТИТЬ втДействующиеСчетчикиОтбор | |||
ИЗ | |||
(ВЫБРАТЬ | |||
Помещения.Помещение КАК Помещение, | |||
Помещения.Счетчик КАК Счетчик, | |||
Помещения.ДатаОкончания КАК ДатаОкончания | |||
ИЗ | |||
РегистрСведений.УТВ_Помещения_Счетчики.СрезПоследних( | |||
КОНЕЦПЕРИОДА(ДАТАВРЕМЯ([GetTime]), МЕСЯЦ), | |||
Помещение В | |||
(ВЫБРАТЬ | |||
ВыбранныеЛС.Помещение КАК Помещение | |||
ИЗ | |||
втВыбранныеЛС КАК ВыбранныеЛС)) КАК Помещения | |||
ГДЕ | |||
(Помещения.ДатаОкончания > НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ([GetTime]), МЕСЯЦ) | |||
ИЛИ Помещения.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1))) КАК ДействующиеСчетчики | |||
ЛЕВОЕ СОЕДИНЕНИЕ втВыбранныеЛС КАК ВыбранныеЛС | |||
ПО ДействующиеСчетчики.Помещение = ВыбранныеЛС.Помещение | |||
; | |||
ВЫБРАТЬ РАЗРЕШЕННЫЕ | |||
УТВ_РегистрацияПоказанийСчетчиков.Счетчик КАК Счетчик, | |||
УТВ_РегистрацияПоказанийСчетчиков.ПериодРасчета КАК ПериодРасчета, | |||
СУММА(УТВ_РегистрацияПоказанийСчетчиков.Потребление) КАК Потребление, | |||
МАКСИМУМ(УТВ_РегистрацияПоказанийСчетчиков.ПоказаниеТекущее) КАК ПоказаниеТекущее | |||
ПОМЕСТИТЬ втПоказанияСчетчиков | |||
ИЗ | |||
РегистрСведений.УТВ_РегистрацияПоказанийСчетчиков КАК УТВ_РегистрацияПоказанийСчетчиков | |||
ГДЕ | |||
УТВ_РегистрацияПоказанийСчетчиков.Счетчик В | |||
(ВЫБРАТЬ | |||
ДействующиеСчетчикиОтбор.Счетчик | |||
ИЗ | |||
втДействующиеСчетчикиОтбор КАК ДействующиеСчетчикиОтбор) | |||
И УТВ_РегистрацияПоказанийСчетчиков.ПериодРасчета.ДатаОкончания < НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ([GetTime]), МЕСЯЦ) | |||
И УТВ_РегистрацияПоказанийСчетчиков.мкэ_ТипРасчета = 0 | |||
СГРУППИРОВАТЬ ПО | |||
УТВ_РегистрацияПоказанийСчетчиков.Счетчик, | |||
УТВ_РегистрацияПоказанийСчетчиков.ПериодРасчета | |||
; | |||
ВЫБРАТЬ | |||
ПоследниеДаннныеПоПУ.Счетчик КАК Счетчик, | |||
ПоследниеДаннныеПоПУ.ПериодРасчетаДатаНачала КАК ПериодРасчетаДатаНачала, | |||
ПоказанияСчетчиков.Потребление КАК Потребление, | |||
ПоказанияСчетчиков.ПоказаниеТекущее КАК ПоказаниеТекущее | |||
ПОМЕСТИТЬ втПоследниеДаннныеПоПУ | |||
ИЗ | |||
(ВЫБРАТЬ | |||
ПоказанияСчетчиков.Счетчик КАК Счетчик, | |||
МАКСИМУМ(ПоказанияСчетчиков.ПериодРасчета.ДатаНачала) КАК ПериодРасчетаДатаНачала | |||
ИЗ | |||
втПоказанияСчетчиков КАК ПоказанияСчетчиков | |||
СГРУППИРОВАТЬ ПО | |||
ПоказанияСчетчиков.Счетчик) КАК ПоследниеДаннныеПоПУ | |||
ЛЕВОЕ СОЕДИНЕНИЕ втПоказанияСчетчиков КАК ПоказанияСчетчиков | |||
ПО ПоследниеДаннныеПоПУ.Счетчик = ПоказанияСчетчиков.Счетчик | |||
И ПоследниеДаннныеПоПУ.ПериодРасчетаДатаНачала = ПоказанияСчетчиков.ПериодРасчета.ДатаНачала | |||
ИНДЕКСИРОВАТЬ ПО | |||
Счетчик | |||
; | |||
ВЫБРАТЬ | |||
УТВ_ПоказанияСчетчиковПоказания.Счетчик КАК Счетчик, | |||
УТВ_ПоказанияСчетчиковПоказания.ПоказаниеТекущее КАК ПоказаниеТекущее | |||
ПОМЕСТИТЬ втПоказанияСчетчиковТекущие | |||
ИЗ | |||
Документ.УТВ_ПоказанияСчетчиков.Показания КАК УТВ_ПоказанияСчетчиковПоказания | |||
ГДЕ | |||
УТВ_ПоказанияСчетчиковПоказания.Ссылка.Дата МЕЖДУ НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ([GetTime]), МЕСЯЦ) И КОНЕЦПЕРИОДА(ДАТАВРЕМЯ([GetTime]), МЕСЯЦ) | |||
И УТВ_ПоказанияСчетчиковПоказания.Счетчик В | |||
(ВЫБРАТЬ | |||
ДействующиеСчетчикиОтбор.Счетчик | |||
ИЗ | |||
втДействующиеСчетчикиОтбор КАК ДействующиеСчетчикиОтбор) | |||
ИНДЕКСИРОВАТЬ ПО | |||
Счетчик | |||
; | |||
ВЫБРАТЬ | |||
ДействующиеСчетчики.ЛицевойСчетКод КАК ЛицевойСчетКод, | |||
ДействующиеСчетчики.Счетчик.Код КАК СчетчикКод, | |||
ДействующиеСчетчики.Счетчик.Наименование КАК СчетчикНаименование, | |||
ЕСТЬNULL(ПоследниеДаннныеПоПУ.ПоказаниеТекущее, 0) КАК ПредыдущееПоказание, | |||
ЕСТЬNULL(ПоказанияСчетчиковТекущие.ПоказаниеТекущее, 0) КАК ТекущиеПереданныеПоказания, | |||
ДействующиеСчетчики.Счетчик.Наименование КАК Счетчик, | |||
ЕСТЬNULL(ПоследниеДаннныеПоПУ.ПериодРасчетаДатаНачала, ДАТАВРЕМЯ(1, 1, 1)) КАК ПериодПредПоказаний, | |||
ДействующиеСчетчики.ЛицевойСчет.Наименование КАК ЛицевойСчет, | |||
ДействующиеСчетчики.Помещение.Наименование КАК Помещение, | |||
ДействующиеСчетчики.Здание.Наименование КАК Здание | |||
ИЗ | |||
втДействующиеСчетчикиОтбор КАК ДействующиеСчетчики | |||
ЛЕВОЕ СОЕДИНЕНИЕ втПоследниеДаннныеПоПУ КАК ПоследниеДаннныеПоПУ | |||
ПО ДействующиеСчетчики.Счетчик = ПоследниеДаннныеПоПУ.Счетчик | |||
ЛЕВОЕ СОЕДИНЕНИЕ втПоказанияСчетчиковТекущие КАК ПоказанияСчетчиковТекущие | |||
ПО ДействующиеСчетчики.Счетчик = ПоказанияСчетчиковТекущие.Счетчик | |||
</nowiki> | |||
---- | ---- | ||
смотрите так же [[Конфигурирование 1C (версия 3.xx) | Конфигурирование 1C]] | |||
Назад к [[SQL_запросы_(версия_3.xx)|SQL-запросам]] | Назад к [[SQL_запросы_(версия_3.xx)|SQL-запросам]] |
Текущая версия на 11:38, 19 апреля 2021
Для работы с данными 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 Doc = Connection.Документы.ИмяВашегоДокумента.СоздатьДокумент (); if (Select.Следующий () === true) { Doc.Организация = Select.Значение; } 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; } !/
Пример многострочного кода на языке 1С
ВЫБРАТЬ РАЗРЕШЕННЫЕ ВЫБОР КОГДА ПОДСТРОКА(УТВ_ЛицевыеСчета.Код, 7, 1) = " " ТОГДА ПОДСТРОКА(УТВ_ЛицевыеСчета.Код, 1, 6) ИНАЧЕ ПОДСТРОКА(УТВ_ЛицевыеСчета.Код, 1, 7) КОНЕЦ КАК ЛицевойСчетКод, УТВ_ЛицевыеСчета.Ссылка КАК ЛицевойСчет, УТВ_ЛицевыеСчета.Здание КАК Здание, УТВ_ЛицевыеСчета.Помещение КАК Помещение, УТВ_ЛицевыеСчета.ФизическоеЛицо КАК ФизическоеЛицо ПОМЕСТИТЬ втВыбранныеЛС ИЗ Справочник.УТВ_ЛицевыеСчета КАК УТВ_ЛицевыеСчета ГДЕ НЕ УТВ_ЛицевыеСчета.ПометкаУдаления И ВЫБОР КОГДА ПОДСТРОКА(УТВ_ЛицевыеСчета.Код, 7, 1) = " " ТОГДА ПОДСТРОКА(УТВ_ЛицевыеСчета.Код, 1, 6) ИНАЧЕ ПОДСТРОКА(УТВ_ЛицевыеСчета.Код, 1, 7) КОНЕЦ = "[Account]" ; ВЫБРАТЬ РАЗРЕШЕННЫЕ ВыбранныеЛС.ЛицевойСчет КАК ЛицевойСчет, ВыбранныеЛС.ЛицевойСчетКод КАК ЛицевойСчетКод, ДействующиеСчетчики.Помещение КАК Помещение, ДействующиеСчетчики.Счетчик КАК Счетчик, ДействующиеСчетчики.ДатаОкончания КАК ДатаОкончания, ВыбранныеЛС.Здание КАК Здание ПОМЕСТИТЬ втДействующиеСчетчикиОтбор ИЗ (ВЫБРАТЬ Помещения.Помещение КАК Помещение, Помещения.Счетчик КАК Счетчик, Помещения.ДатаОкончания КАК ДатаОкончания ИЗ РегистрСведений.УТВ_Помещения_Счетчики.СрезПоследних( КОНЕЦПЕРИОДА(ДАТАВРЕМЯ([GetTime]), МЕСЯЦ), Помещение В (ВЫБРАТЬ ВыбранныеЛС.Помещение КАК Помещение ИЗ втВыбранныеЛС КАК ВыбранныеЛС)) КАК Помещения ГДЕ (Помещения.ДатаОкончания > НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ([GetTime]), МЕСЯЦ) ИЛИ Помещения.ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1))) КАК ДействующиеСчетчики ЛЕВОЕ СОЕДИНЕНИЕ втВыбранныеЛС КАК ВыбранныеЛС ПО ДействующиеСчетчики.Помещение = ВыбранныеЛС.Помещение ; ВЫБРАТЬ РАЗРЕШЕННЫЕ УТВ_РегистрацияПоказанийСчетчиков.Счетчик КАК Счетчик, УТВ_РегистрацияПоказанийСчетчиков.ПериодРасчета КАК ПериодРасчета, СУММА(УТВ_РегистрацияПоказанийСчетчиков.Потребление) КАК Потребление, МАКСИМУМ(УТВ_РегистрацияПоказанийСчетчиков.ПоказаниеТекущее) КАК ПоказаниеТекущее ПОМЕСТИТЬ втПоказанияСчетчиков ИЗ РегистрСведений.УТВ_РегистрацияПоказанийСчетчиков КАК УТВ_РегистрацияПоказанийСчетчиков ГДЕ УТВ_РегистрацияПоказанийСчетчиков.Счетчик В (ВЫБРАТЬ ДействующиеСчетчикиОтбор.Счетчик ИЗ втДействующиеСчетчикиОтбор КАК ДействующиеСчетчикиОтбор) И УТВ_РегистрацияПоказанийСчетчиков.ПериодРасчета.ДатаОкончания < НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ([GetTime]), МЕСЯЦ) И УТВ_РегистрацияПоказанийСчетчиков.мкэ_ТипРасчета = 0 СГРУППИРОВАТЬ ПО УТВ_РегистрацияПоказанийСчетчиков.Счетчик, УТВ_РегистрацияПоказанийСчетчиков.ПериодРасчета ; ВЫБРАТЬ ПоследниеДаннныеПоПУ.Счетчик КАК Счетчик, ПоследниеДаннныеПоПУ.ПериодРасчетаДатаНачала КАК ПериодРасчетаДатаНачала, ПоказанияСчетчиков.Потребление КАК Потребление, ПоказанияСчетчиков.ПоказаниеТекущее КАК ПоказаниеТекущее ПОМЕСТИТЬ втПоследниеДаннныеПоПУ ИЗ (ВЫБРАТЬ ПоказанияСчетчиков.Счетчик КАК Счетчик, МАКСИМУМ(ПоказанияСчетчиков.ПериодРасчета.ДатаНачала) КАК ПериодРасчетаДатаНачала ИЗ втПоказанияСчетчиков КАК ПоказанияСчетчиков СГРУППИРОВАТЬ ПО ПоказанияСчетчиков.Счетчик) КАК ПоследниеДаннныеПоПУ ЛЕВОЕ СОЕДИНЕНИЕ втПоказанияСчетчиков КАК ПоказанияСчетчиков ПО ПоследниеДаннныеПоПУ.Счетчик = ПоказанияСчетчиков.Счетчик И ПоследниеДаннныеПоПУ.ПериодРасчетаДатаНачала = ПоказанияСчетчиков.ПериодРасчета.ДатаНачала ИНДЕКСИРОВАТЬ ПО Счетчик ; ВЫБРАТЬ УТВ_ПоказанияСчетчиковПоказания.Счетчик КАК Счетчик, УТВ_ПоказанияСчетчиковПоказания.ПоказаниеТекущее КАК ПоказаниеТекущее ПОМЕСТИТЬ втПоказанияСчетчиковТекущие ИЗ Документ.УТВ_ПоказанияСчетчиков.Показания КАК УТВ_ПоказанияСчетчиковПоказания ГДЕ УТВ_ПоказанияСчетчиковПоказания.Ссылка.Дата МЕЖДУ НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ([GetTime]), МЕСЯЦ) И КОНЕЦПЕРИОДА(ДАТАВРЕМЯ([GetTime]), МЕСЯЦ) И УТВ_ПоказанияСчетчиковПоказания.Счетчик В (ВЫБРАТЬ ДействующиеСчетчикиОтбор.Счетчик ИЗ втДействующиеСчетчикиОтбор КАК ДействующиеСчетчикиОтбор) ИНДЕКСИРОВАТЬ ПО Счетчик ; ВЫБРАТЬ ДействующиеСчетчики.ЛицевойСчетКод КАК ЛицевойСчетКод, ДействующиеСчетчики.Счетчик.Код КАК СчетчикКод, ДействующиеСчетчики.Счетчик.Наименование КАК СчетчикНаименование, ЕСТЬNULL(ПоследниеДаннныеПоПУ.ПоказаниеТекущее, 0) КАК ПредыдущееПоказание, ЕСТЬNULL(ПоказанияСчетчиковТекущие.ПоказаниеТекущее, 0) КАК ТекущиеПереданныеПоказания, ДействующиеСчетчики.Счетчик.Наименование КАК Счетчик, ЕСТЬNULL(ПоследниеДаннныеПоПУ.ПериодРасчетаДатаНачала, ДАТАВРЕМЯ(1, 1, 1)) КАК ПериодПредПоказаний, ДействующиеСчетчики.ЛицевойСчет.Наименование КАК ЛицевойСчет, ДействующиеСчетчики.Помещение.Наименование КАК Помещение, ДействующиеСчетчики.Здание.Наименование КАК Здание ИЗ втДействующиеСчетчикиОтбор КАК ДействующиеСчетчики ЛЕВОЕ СОЕДИНЕНИЕ втПоследниеДаннныеПоПУ КАК ПоследниеДаннныеПоПУ ПО ДействующиеСчетчики.Счетчик = ПоследниеДаннныеПоПУ.Счетчик ЛЕВОЕ СОЕДИНЕНИЕ втПоказанияСчетчиковТекущие КАК ПоказанияСчетчиковТекущие ПО ДействующиеСчетчики.Счетчик = ПоказанияСчетчиковТекущие.Счетчик
смотрите так же Конфигурирование 1C
Назад к SQL-запросам