2) Дорожная карта разработчика 1С. Технические навыки
https://groxin.ru/lessons/dorozhnaja-karta-razrabotchika-1s-tehnicheskie-navyki/
Фундаментальные навыки
Язык запросов:
Операторы языка запросов
Функции языка запросов
Соединения
Реляционная модель
Временные таблицы
Виртуальные таблицы
Работа с параметрами в запросе
Подзапросы
Коррелирующие запросы
Срез последних на каждую дату
Генерирующие запросы
Понимание назначения основных метаданных платформы
Верхнеуровнево
Константы
Перечисления
Общие модули и модули объектов
Справочники
Документы
Регистры бухгалтерии
Регистры сведений
Регистры накопления
Регистры расчета
Перечисления
Отчеты
Обработки
Планы видов характеристик
Бизнес-процессы
Задачи
Регламентные задания
Детально
Стандартные реквизиты
Виртуальные таблицы
Измерения/Ресурсы/Реквизиты
Программирование с использованием платформы 1С
Объектная модель языка
Стандартная библиотека объектов и методов
Стандарты разработки 1С
Ролевая модель
Роли
Права доступа
Ограничение доступа на уровне записей Р1_3
Интерфейс пользователя
Управляемые формы
События форм
События элементов форм
Клиент-серверное взаимодействие
Конструктор форм
Особенности клиентов: Тонкий/Толстый/Веб-клиент
Программная генерация формы
Взаимодействие между формами приложения
Старая/новая
асинхронность
Временное хранилище
Оптимизация клиент-серверных вызовов
Вывод данных
Макет табличного документа
СКД
Три вида набора данных
Запрос
Объединение
Объект
Инструментарий разработки (Консоли СКД)
Программная компоновка
Значение и представление поля
Связи наборов
Роли полей СКД
Типы полей
Функции языка выражений
Компоновка не только в табличный документ
Работа с изображениями
Настройка структуры вывода
Макеты
Работа с расшифровкой
Значение и представление поля
Выражение представления
Условное оформление
Макет поля
Компоновка не только в табличный документ
Таблица значений. Дерево ________значений________
Настройка структуры вывода
Вложенные элементы схемы
Таблицы
Дополнение периода
Настроки элементов данных
Система контроля версий исходного кода
Хранилище конфигурации
С1Т
Управление релизами
Обновление типовых
конфигураций
Обновление доработанных типовых конфигураций
Составляющие, методы и инструменты обновления
Доработка типовых конфигураций
Правила доработки конфигураций
Расширения конфигурации
Доработка конфигураций для технологии 1С:РгезИ
Технологии интеграции
Файловые обмены
НТТР-сервисы
Веб-сервисы
Планы-обмена
СОМ-Объект
Конвертация данных
Брокеры сообщений
Шина данных (ЕЗВ)
Е-та(1
Сервер взаимодействия
Библиотеки
Библиотека стандартных подсистем
Понимание
функционального
назначения каждой
подсистемы
Параметры запуска
Внедрение библиотеки в конфигурацию
Интеграция добавленных
объектов конфигурации с
библиотекой
Подсистема"Управление доступом"
Подсистема "Печать*
Подсистема
"Дополнительные отчеты и
обработки"
Подсистема "Обмен данными'
Базовая функциональность
153) Агрегатные функции в запросе нужны
в случаях когда нам нужно вычислить какое-то одиночное значение из набора значений. К примеру, у нас есть некоторый набор чисел (3, 1, 4, 5), с помощью агрегатных функций мы можем их просуммировать, получив число 13, или вычислить минимум - число 1. Все из них имеют аналогичный синтаксис и используются похожим образом.
https://groxin.ru/lessons/agregatnye-funktsii-v-zaprose/
156) суммирует значения колонки (поля)
СУММА(ИмяПоля) – суммирует значения колонки (поля). Следует помнить, что суммировать можно только числовые поля. Если поле имеет составной тип данных, содержит не только числовые значения, то функция может быть применена, но в случае появления в выборке нечислового поля, выполнение запроса закончится с ошиб
ВЫБРАТЬ
СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК ОбщееКоличествоТоваров,
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
164) вычисляет минимальное значение колонки (поля)
МИНИМУМ(ИмяПоля) – вычисляет минимальное значение колонки (поля).
167) вычисляет максимальное значение колонки (поля).
МАКСИМУМ(ИмяПоля) – вычисляет максимальное значение колонки (поля).
170) вычисляет среднее значение колонки (поля).
СРЕДНЕЕ(ИмяПоля) – вычисляет среднее значение колонки (поля).
Следует помнить, что у каждого типа данных есть свои правила сравнения. Подробнее можно прочитать в статье о правилах сравнения значений.
202) подсчитывает количество значений колонки
КОЛИЧЕСТВО(ИмяПоля) – подсчитывает количество значений колонки
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ИмяПоля) - подсчитывает количество уникальных значений колонки
Примеры
Если в выборке присутствуют только поля к которым применяется агрегатная функция, то применение выглядит следующим образом:
ВЫБРАТЬ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПоступлениеТоваровУслугТовары.Номенклатура) КАК КоличествоРазличныхНоменклатур,
СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК ОбщееКоличествоТоваров,
МИНИМУМ(ПоступлениеТоваровУслугТовары.Сумма) КАК МинимальнаяСуммаПокупки
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
Если в выборке пристутствуют поля не использующие агрегатные функции, они обязательно должны быть указаны в секции СГРУППИРОВАТЬ ПО:
ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.Номенклатура,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения)
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
СГРУППИРОВАТЬ ПО
ПоступлениеТоваровУслугТовары.Номенклатура
В таком случае поля указанные в секции СГРУППИРОВАТЬ будут использованы в качестве разрезов группировки. И значения агрегатных функций будут рассчитаны в разрезе этих группировок.
К примеру есть следующий набор данных:
Номенклатура Количество
Яблоко 1
Яблоко 3
Апельсин 2
Апельсин 4
Мы используем агрегатную функцию Сумма на колонке "Количество", чтобы вычислить общее количество товаров
ВЫБРАТЬ
ТаблицаТоваров.Номенклатура,
СУММА(ТаблицаТоваров.Количество) КАК Количество
ИЗ
ТаблицаТоваров КАК ТаблицаТоваров
СГРУППИРОВАТЬ ПО
ТаблицаТоваров.Номенклатура
Так как поле "Номенклатура" так же присутствует в полях выборки мы обязаны указать его в секции группировки.
В результате мы получим следующий набор данных:
Номенклатура Количество
Яблоко 4
Апельсин 6
Повторяющиеся значения номенклатуры превратились в одну, а их количества просуммировались.
В случае если же мы хотим узнать общее количество номенклатуры для всего набора данных, мы можем использовать секцию "Итоги". Подробнее читайте в соотвествующей статье Секция запроса Итоги По.
Стоит отметить, что перечисленные функции также могут использоваться и с оператором ВЫБОР.
Пример, зададим условие на количество товаров, и определим значения поля, если условия выполняются:
ВЫБРАТЬ
Товары.Номенклатура КАК Номенклатура,
ВЫБОР
КОГДА СУММА(Товары.Количество) > 5
ТОГДА "Нормально"
ИНАЧЕ "Слишком мало"
КОНЕЦ КАК ОценкаПокупок
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК Товары
СГРУППИРОВАТЬ ПО
Товары.Номенклатура
Результатом может быть такая таблица:
Номенклатура ОценкаПокупок
Апельсины Слишком мало
Яблоки Слишком мало
Клубника Слишком мало
Салфетки Нормально
Фруктовый сок Слишком мало
Фруктово-ореховая смесь Нормально
286) Вычисляемые значения в запросе можно назвать
значения в результате запроса, которые в итоговом виде не хранятся в базе данных.
Этот термин одинаково применим как к значениям которые сформировались из данных хранящихся в базе данных, так и появившиеся без их участия.
Система управления базами данных (СУБД), может исполнять запросы вне зависимости от того, связаны он с данными конкретной БД или нет.
https://groxin.ru/lessons/vychisljaemye-znachenija-v-zaprose/
295) Вычисления с числами
ВЫБРАТЬ
1 + 1 КАК Результат
299) Вычисления со строками
ВЫБРАТЬ
"Привет," + " мир!" КАК Результат
303) Вычисления с датами
ВЫБРАТЬ
ДАТАВРЕМЯ(2022, 11, 7, 22, 40, 0) КАК КакаяТоДата,
ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2022, 11, 7, 22, 40, 0), СЕКУНДА, 1) КАК КакаяТоДатаПлюсСекунда
КакаяТоДата КакаяТоДатаПлюсСекунда
07.11.2022 22:40:00 07.11.2022 22:40:01
312) Использование предопределенных значений в запросах
те значения, которые либо поставляются платформой (системные перечисления) либо созданы разработчиком в конфигураторе (перечисления, предопределенные элементы справочников), например системным перечислением заполняется значение поля ВидДвижения у регистров накопления с видом "Остатки" - ВидДвиженияНакопления.Приход, или ВидДвиженияНакопления.Расход.
315) Функция ЗНАЧЕНИЕ
Для использования таких значений в запросах используется функция ЗНАЧЕНИЕ(ОписаниеЗначения) - Где ОписаниеЗначения это полный путь к значению в метаданных, либо имя системного перечисления и его значение
Примеры использования:
1. Получаем список документов ПоступлениеТоваровУслуг в которых значение поля контрагент не заполнено, и равняется пустой ссылке
ВЫБРАТЬ
ПоступлениеТоваровУслуг.Ссылка КАК Ссылка
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ГДЕ
ПоступлениеТоваровУслуг.Контрагент = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
В базе тренажера нет таких документов, потому в результате мы получим пустую таблицу, но теперь мы уверенны, что все документы заполнены корректно.
2. Получаем список элементов справочника Номенклатура, у которых поле ВидНоменклатуры заполнено значением Услуга из перечисления ВидыНоменклатуры
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
3. Получим все записи из регистра накопления, в которых мы уменьшаем количество хранящихся в нем единиц товара
ВЫБРАТЬ
ТоварыНаСкладах.Регистратор КАК ДокументРегистратор,
ТоварыНаСкладах.Номенклатура КАК Товар,
ТоварыНаСкладах.Количество КАК Количество
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
ГДЕ ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход)
https://groxin.ru/lessons/ispolzovanie-predopredelennyh-znachenij-v-zaprosah/
350) Конструкция ЕСТЬ NULL
Значение NULL в запросе может появиться в момент когда мы соединяем две таблицы используя Левое/Правое/Полное соединение, и в тех полях, где должны были быть значения присоединяемой таблицы, но условие связи не выполнилось, будет значение NULL.
Следует различать так же функцию ЕСТЬNULL и выражение ЕСТЬ NULL, между ними кроме наличия пробела между словами есть более сильные различия.
355) Функция ЕСТЬNULL
ЕстьNULL(ПроверяемоеПоле, ВыражениеЗамены) - Где ПроверяемоеПоле это поле таблицы результата запроса, а ВыражениеЗамены определяет какое значение будет подставлено в поле, если вдруг там попалось значение NULL
ВЫБРАТЬ
ПоступлениеТоваровУслуг.Ссылка КАК Поступление,
РеализацияТоваровУслуг.Ссылка КАК Реализация
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ПоступлениеТоваровУслуг.Контрагент = РеализацияТоваровУслуг.Контрагент
В результате мы увидим:
Поступление Реализация
Поступление товаров услуг 000000001 от 13.05.2022 9:51:06 N111.1-
Поступление товаров услуг 000000002 от 16.05.2022 10:30:32 N111.1-
Поступление товаров услуг 000000003 от 16.05.2022 10:30:41 ши
Так как тип NULL при попадании в результат запроса и дальнейшей обработке его кодом 1С содержит крайне мало информации мы должны преобразовать его в что-то более понятное. В данном случае в запросе мы хотели получить значение ссылки документа РеализацияТоваровУслуг. Потому будет логично, если мы заменим NULL на какое-то более понятное значение. Можно было бы заменить значение на пустую ссылку документа РеализацияТоваровУслуг, но для простоты мы поместим туда просто строку "Нет документа реализации". А если интересно, как подставить пустую ссылку в качестве значения, то обратите внимание на статью Использование предопределенных значений в запросах.
Это, при последующей обработке, даст нам и последующим разработчикам понимание, что мы хотели получить ссылки на конкретный тип объектов базы данных, но вместо них получили какое-то другое значение, которое необходимо принимать как значение по умолчанию. Описываемые мной действия нужны больше для соблюдения чистоты, и некой красоты кода, и строго рекомендованы к использованию.
Пример. Доработаем запрос из предыдущего примера, и сделаем его результат более понятным:
ВЫБРАТЬ
ПоступлениеТоваровУслуг.Ссылка КАК Поступление,
ЕСТЬNULL(РеализацияТоваровУслуг.Ссылка, "Нет документа реализации") КАК Реализация
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ПоступлениеТоваровУслуг.Контрагент = РеализацияТоваровУслуг.Контрагент
Результат:
Поступление Реализация
Поступление товаров услуг 000000001 от 13.05.2022 9:51:06 Нет документа реализации
Поступление товаров услуг 000000002 от 16.05.2022 10:30:32 Нет документа реализации
Поступление товаров услуг 000000003 от 16.05.2022 10:30:41 Нет документа реализации
395) Оператор ЕСТЬ NULL
Оператор ЕСТЬ NULL – это выражение условия проверяющее является ли выбранное значение типом значения Null. При проверке следует применять именно его так как сравнение вида Номенклатура.Ссылка = Null не даст корректного результата.
Этот оператор нужен нам когда нам необходимо выполнить обработку всего набора данных, в зависимости от наличия значения NULL в результате. Например, мы хотим очистить результат запроса от неподходящих данных и полностью исключить из результата все строки, где в поле Реализация содержится значение NULL.
Пример:
ВЫБРАТЬ
ПоступлениеТоваровУслуг.Ссылка КАК Поступление,
РеализацияТоваровУслуг.Ссылка КАК Реализация
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ПО ПоступлениеТоваровУслуг.Контрагент = РеализацияТоваровУслуг.Контрагент
ГДЕ
НЕ РеализацияТоваровУслуг.Ссылка ЕСТЬ NULL
Результатом будет пустая таблица, так как в базе нет документов подходящих под условие. В данном случае мы убрали из текста запроса функцию ЕСТЬNULL, из-за того что она больше не несет никакого смысла, так как записи с NULL не попадают в результат запроса.
https://groxin.ru/lessons/konstruktsija-est-null/
417) Логический оператор ССЫЛКА
Логический оператор ССЫЛКА позволяет произвести проверку ссылочного значения вхождения в объектную таблицу указанного вида.
Пример, мы отбираем записи у которых в поле Номенклатура содержится значение из справочника Номенклатура:
ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.Номенклатура КАК Номенклатура,
ПоступлениеТоваровУслугТовары.Количество КАК Количество
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
ГДЕ ПоступлениеТоваровУслугТовары.Номенклатура ССЫЛКА Справочник.Номенклатура
Данный пример не имеет прикладного смысла в базе данных тренажера, так как в поле Номенклатура не содержится других значений, но показывает возможность применения оператора
https://groxin.ru/lessons/logicheskij-operator-ssylka/
433) Неопределено и NULL
В результате выборки некоторые поля могут принимать значения Неопределено и NULL.
Неопределено - Чаще всего возникает как результат незаполненного значения в поле составного типа (такие поля могут содержать значения ссылочных типов на разные объекты метаданных, например документ РеализацияТоваров и ПоступлениеТоваров).
NULL - возникает в результате соединения или объединения таблиц, в том случае когда в какой-либо из строк соединение не произошло, не найдено значение из условия соединения в одной из таблиц.
https://groxin.ru/lessons/neopredeleno-i-null/
440) Обмен данными. Регистрация изменений объектов
Описание
Планы обмена это важный компонент платформы позволяющий регистрировать изменения в данных для обменов. Подробнее можно прочитать по ссылке Планы обмена.
Но нас в первую очередь интересует как это влияет на запросы.
Если объект входит в состав плана обмена, то у каждой объектной таблицы представлена дополнительная таблица — таблица изменений.
<ИмяОсновнойТаблицы>.Изменения содержит значения общих реквизитов и полей:
НомерСообщения отправки изменений (NULL для неотправленных),
Узел - ссылка узла плана обмена,
Ссылка (для объектов) или Регистратор (для записей регистров) и т.д.
В системе представлена возможность управления структурой таблиц изменения. Например, если для измерения регистра не установлено свойство "ОсновнойОтбор", тогда таблица изменений будет содержать информацию об измененных строках без учета такого измерения.
Пример
Получить изменения можно запросом:
ВЫБРАТЬ
ПоступлениеТоваровУслугИзменения.Узел КАК Узел,
ПоступлениеТоваровУслугИзменения.НомерСообщения КАК НомерСообщения,
ПоступлениеТоваровУслугИзменения.Ссылка КАК Ссылка
ИЗ
Документ.ПоступлениеТоваровУслуг.Изменения КАК ПоступлениеТоваровУслугИзменения
Результатом будет таблица:
Узел НомерСообщения Ссылка
Центральная база Поступление товаров услуг 000000001 от 13.05.2022 9:51:06
Центральная база Поступление товаров услуг 000000002 от 16.05.2022 10:30:32
Центральная база Поступление товаров услуг 000000003 от 16.05.2022 10:30:41
https://groxin.ru/lessons/obmen-dannymi-registratsija-izmenenij-obektov/
473) Объединения. Объединение таблиц в запросе
Часто при написании запросов возникает необходимость объединить две таблицы или набора данных. Ключевое отличие объединений от соединения заключается в том, что при соединении к одному набору данных присоединяется второй справа или слева с возможностью указать условия такого соединения, а при объединении один набор данных присоединяется ко второму снизу без возможности фильтрации.
Если брать за пример самый простой случай, то:
1) Соединения чаще всего делаются для добавления в результат дополнительных полей, которых нет в одной таблице, но они есть в другой.
2) Объединения чаще всего используются для добавления в результат дополнительных строк, которые так же отсутствуют в одной таблице, но есть в другой.
На практике оба этих механизма могут использоваться и для одного и для другого, но для простоты понимания, наверное, это самое подходящее объяснение.
Если изобразить это отличие визуально, то нужно задать два исходных набора данных:
Представим, что у нас есть таблица Фрукты:
Название Цвет Количество
Банан Желтый 2
Апельсин Оранжевый 5
Яблоко Зеленый 3
И таблица Овощи:
Название Цвет Количество
Огурец Зеленый 4
Тыква Оранжевый 2
Кукуруза Желтый 5
Если бы мы захотели узнать какие у нас есть фрукты и овощи одинакового цвета, то мы бы использовали соединение:
ВЫБРАТЬ
Фрукты.Название КАК НазваниеФрукта,
Фрукты.Цвет КАК ЦветФрукта,
Овощи.Название КАК НазваниеОвоща,
Овощи.Цвет КАК ЦветОвоща
Из Фрукты КАК Фрукты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Овощи КАК Овощи
ПО Фрукты.Цвет = Овощи.Цвет
В результате, используя внутреннее соединение, получили бы таблицу, содержащую только фрукты и овощи одинакового цвета:
НазваниеФрукта ЦветФрукта НазваниеОвоща ЦветОвоща
Банан Желтый Кукуруза Желтый
Апельсин Оранжевый Тыква Оранжевый
Яблоко Зеленый Огурец Зеленый
А в ситуации когда нам захотелось бы получить данные по всем фруктам и овощам в одном наборе данных, нам бы пригодилось объединение.
ВЫБРАТЬ
Фрукты.Название КАК Название,
Фрукты.Цвет КАК Цвет,
Фрукты.Количество КАК Количество
ИЗ
Фрукты КАК Фрукты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Овощи.Название,
Овощи.Цвет,
Овощи.Количество
ИЗ
Овощи КАК Овощи
В результате мы получим объединенную таблицу содержащую данные из обеих таблиц
Название Цвет Количество
Яблоко Зеленый 3
Апельсин Оранжевый 5
Банан Желтый 2
Огурец Зеленый 4
Тыква Оранжевый 2
Кукуруза Желтый 5
Как видите, данные таблицы Овощи присоединились к данным таблицы Фрукты снизу.
При использовании соединений стоит учитывать, что СУБД сама не может определить какие данные в каких столбцах находятся и как их необходимо сопоставлять, потому стоит следить за соответствием полей из разных таблиц самостоятельно. Порядок полей в запросе и определяет их соответствие. В этом примере важно, чтобы поля Название, Цвет, Количество располагались в выборке из обеих таблиц именно в таком порядке, иначе мы получим совсем не то, что хотели.
Например, я поменяю местами цвет и количество в выборке из таблицы Овощи таким образом, чтобы их порядок не совпадал с порядком полей в выборке из таблицы Фрукты:
ВЫБРАТЬ
Фрукты.Название КАК Название,
Фрукты.Цвет КАК Цвет,
Фрукты.Количество КАК Количество
ИЗ
Фрукты КАК Фрукты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Овощи.Цвет,
Овощи.Название,
Овощи.Количество
ИЗ
Овощи КАК Овощи
В этом случае мы получим следующий результат:
Название Цвет Количество
Яблоко Зеленый 3
Апельсин Оранжевый 5
Банан Желтый 2
Зеленый Огурец 4
Оранжевый Тыква 2
Желтый Кукуруза 5
Из-за того, что мы поменяли поля местами, то и результат получили соответствующий. Поле Цвет из таблицы Овощи попало в колонку Название, и испортило результат. Исходя из этого можно сделать вывод, названия полей в результирующей таблице определяются по первой таблице в объединении. Это важный момент, соответствие полей всегда нужно контролировать вручную.
Так же, в случае если нам необходимо объединить наборы данных которые отличаются по количеству полей, например в таблице Фрукты было бы два поля Название и Цвет, а в таблице Овощи так же остались бы все поля Название, Цвет и Количество, то такое объединение тоже можно выполнить, нам только нужно будет установить какое-то значение по умолчанию для недостающего поля. Больше подходящее по ситуации, например "Не заполнено", 0, Null и т.д.
ВЫБРАТЬ
Фрукты.Название КАК Название,
Фрукты.Цвет КАК Цвет,
"Не заполнено" КАК Количество
ИЗ
Фрукты КАК Фрукты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Овощи.Цвет,
Овощи.Название,
Овощи.Количество
ИЗ
Овощи КАК Овощи
В результате мы получим:
Название Цвет Количество
Яблоко Зеленый Не заполнено
Апельсин Оранжевый Не заполнено
Банан Желтый Не заполнено
Зеленый Огурец 4
Оранжевый Тыква 2
Желтый Кукуруза 5
Используя такую технику можно в целом обходить практически все ситуации когда какого-то поля нехватает.
Теперь перейдем к более подробному описанию вариантов синтаксиса объединений. Их бывает два Объединить и Объединить ВСЕ.
604) Объединить
Используется в тех случаях, когда объединяемые наборы данных могут содержать одинаковые строки, в случае появления дублирующихся строк они будут удалены из результата таким образом, чтобы все строки в результате стали уникальными, то-есть не имели повторений по всем полям.
607) Объединить ВСЕ
Используется в тех случаях, когда нам неважно будут ли наборы содержать не уникальные строки, объединение произойдет полностью, без дополнительной обработки результата. Если попадутся полностью одинаковые строки, то они так и останутся в результате.
Следует учитывать, какие именно данные будут содержаться во всех объединяемых наборах данных, и стараться использовать Объединить ВСЕ в случаях, когда нам точно известно, что наборы не будут иметь дублирующихся строк. При использовании Объединить, операция поиска и удаления дублей строк выполняется всегда, даже если в итоге это никак не повлияет на результат, но какое-то время эта операция занимает, и тратит вычислительные ресурсы впустую, что может замедлить выполнение вашего запроса без какого либо полезного эффекта.
https://groxin.ru/lessons/obedinenija/
613) Оператор ПОМЕСТИТЬ (Временные таблицы)
Оператор ПОМЕСТИТЬ <ПроизвольноеИмяТаблицы> - Создает из результата запроса временную таблицу и сохраняет его результат в памяти на время выполнения пакета запросов.
Используется только сразу после секции ВЫБРАТЬ и перечисления всех полей.
Например:
ВЫБРАТЬ
"Какое-то значение" КАК СтроковоеПоле
ПОМЕСТИТЬ ЛюбоеНазваниеТаблицы
;
ВЫБРАТЬ
ЛюбоеНазваниеТаблицы.СтроковоеПоле
ИЗ ЛюбоеНазваниеТаблицы КАК ЛюбоеНазваниеТаблицы
Результат:
СтроковоеПоле
Какое-то значение
или так
ВЫБРАТЬ
Диваны.Наименование КАК Диван
ПОМЕСТИТЬ ВТНаименованияДиванов
ИЗ Справочник.Диваны КАК Диваны
;
ВЫБРАТЬ
ВТНаименованияДиванов.Диван КАК Диван
ИЗ ВТНаименованияДиванов КАК ВТНаименованияДиванов
Результат:
Диван
Диван-кровать Парма
Диван-кровать Уно
Диван-кровать Твигги
Диван-кровать Эрик
Диван-кровать Люси
Диван Ночной путник
Диван-кровать Люси
Диван-кровать Люси
Диван-кровать Люси
Диван-кровать Твигги Уценка
оказывается, в нашей базе много диванов с одинаковым названием.
Уточним терминологию. Пакетом запросов называется запрос содержащий в себе одновременно несколько запросов, разделенных символов точки с запятой (;). С практической точки зрения такие запросы чаще всего используются при вычислениях с помощью временных таблиц. Когда мы в одном тексте запроса производим несколько преобразований над данными в разных частях запроса выполняемых по очереди. Это упрощает как чтение, так и некоторые сложные вычисления позволяет разбить на этапы. А так же некоторые вычисления вообще невозможны без использования временных таблиц.
Иногда пакетные запросы используют для оптимизации вычислений в сложных запросах, они позволяют за одно обращение к СУБД получить данные для разных частей программы 1С с помощью кода 1С. Смотри статью пакетные запросы
Пример 1. Вычисление без временных таблиц, с использованием вложенного запроса:
Представим что мы хотим найти все диваны, у которых цена равна максимальной. Для этого нам нужно сначала найти максимальную цену. А после этого найти диваны у которых цена равна максимальной.
ВЫБРАТЬ
Диваны.Наименование КАК Наименование,
Диваны.Код,
Диваны.Цена КАК Цена
ИЗ
Справочник.Диваны КАК Диваны
ВНУТРЕННЕЕ СОЕДИНЕНИЕ
(
ВЫБРАТЬ
МАКСИМУМ(Диваны.Цена) КАК Цена
ИЗ
Справочник.Диваны КАК Диваны
) КАК МинЦенаДиваны
ПО Диваны.Цена = МинЦенаДиваны.Цена
Результат:
Наименование Код Цена
Диван-кровать Люси 5 40 000
Диван-кровать Люси 7 40 000
Диван-кровать Люси 8 40 000
Диван-кровать Люси 9 40 000
Мы видим, что в блок соединений, при данном способе, пришлось добавить в качестве источника данных вложенный запрос. Это в целом нормальная практика, и так можно решить множество задач. Но она ухудшает читаемость, снижает возможности отладки запроса (довольно сложно посмотреть что происходит во вложенном запросе при выполнении), и в некоторых случаях снижает производительность.
Пример 2. Вычисление с применением временных таблиц.
Решим задачу из примера 1, с помощью временных таблиц.
ВЫБРАТЬ
МАКСИМУМ(Диваны.Цена) КАК Цена
ПОМЕСТИТЬ ВТМинЦенаДиваны
ИЗ
Справочник.Диваны КАК Диваны
;
ВЫБРАТЬ
Диваны.Наименование КАК Наименование,
Диваны.Код,
Диваны.Цена КАК Цена
ИЗ
Справочник.Диваны КАК Диваны
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТМинЦенаДиваны
ПО Диваны.Цена = ВТМинЦенаДиваны.Цена
Результат будет тот же:
Как видим мы использовали возможности пакетного запроса. Первый запрос в нашем тексте запроса, с помощью оператора ПОМЕСТИТЬ перед секцией ИЗ, создает временную таблицу с именем ВТМинЦенаДиваны (Использование префикса ВТ общепринято в среде разработчиков, так как сразу позволяет понять по тексту запроса, что это Временная Таблица).
Второй запрос пакета использует эту временную таблицу, обращаясь к ней по имени (ВТМинЦенаДиваны) в секции соединений как к любой другой таблице. Теперь мы имеем возможность наблюдать последовательность преобразования данных. При выполнении запроса в коде 1С, во множестве популярных консолей запросов, а так же в нашей академии вы можете просматривать результат выполнения временной таблицы в отдельной вкладке результата.
Созданные временные таблицы существуют в запросе до момента завершения его выполнения. Или до момента явного указания оператора УНИЧТОЖИТЬ. После этого они удаляются.
Пример:
ВЫБРАТЬ
Диваны.Ссылка КАК Ссылка
ПОМЕСТИТЬ ВТДиваны
ИЗ
Справочник.Диваны КАК Диваны
;
УНИЧТОЖИТЬ ВТДиваны
;
ВЫБРАТЬ
ВТДиваны.Ссылка КАК Ссылка
ИЗ
ВТДиваны КАК ВТДиваны
Такой запрос уже не сработает. Будет получена ошибка "Таблица не найдена ВТДиваны". Так как мы попытались использовать временную таблицу после того как явно ее уничтожили.
Уничтожение временных таблиц полезно когда данные, которые в ней содержатся уже не нужны для дальнейших вычислений в запросе (это основная причина использования, т.к. временные таблицы иногда могут содержать довольно большой объем данных, все зависит от того что вы туда поместите, который занимает место в оперативной памяти компьютера и может привести к замедлению работы приложения или критической ошибке). Или мы можем захотеть уничтожить временную таблицу, когда мы например решим удалить старую создать новую временную таблицу с таким же именем, но с другими данными.
https://groxin.ru/lessons/operator-pomestit-vremennye-tablitsy/
751) Параметры в запросе
Платформа 1С поддерживает параметризованные запросы. Чаще всего это используется когда результат запроса должен зависеть от переданных в него извне данных.
Синтаксис параметров в запросе достаточно просто в освоении, перед каждым параметром обязателен специальный символ "амперсанд"-&, чтобы в итоге получилось &НазваниеПараметра. Значения передаваемые в параметрах могут содержать и какое-то единичное значение, и коллекцию объектов.
В коде на языке 1С, мы бы описали передачу параметра в запрос следующим образом
Запрос = Новый Запрос();
Запрос.Текст = "
|ВЫБРАТЬ
| &ТекущаяДата КАК ТекущаяДата";
Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДатаСеанса());
Примеры
Например мы хотим передать значение текущей даты в запрос. В нашем сервисе этот параметр в запросе поддерживается по умолчанию, для этого нужно написать следующий текст запроса.
ВЫБРАТЬ
&ТекущаяДата КАК ТекущаяДата
ТекущаяДата
17.06.2022 0:00:00
А в следующем примере мы использовали параметр в условиях, как если бы желали получить список всех документов у которого дата меньше чем переданная в параметре ТекущаяДата
ВЫБРАТЬ
ПоступлениеТоваровУслуг.Ссылка КАК Ссылка,
ПоступлениеТоваровУслуг.Дата КАК Дата
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ГДЕ
ПоступлениеТоваровУслуг.Дата <= &ТекущаяДата
Результат будет следующий:
Ссылка Дата
Поступление товаров услуг 000000001 от 13.05.2022 9:51:06 13.05.2022 9:51:06
Поступление товаров услуг 000000002 от 16.05.2022 10:30:32 16.05.2022 10:30:32
Поступление товаров услуг 000000003 от 16.05.2022 10:30:41 16.05.2022 10:30:41
https://groxin.ru/lessons/parametry-v-zaprose/
792) Правила сравнения значений. Сравнение значений совпадающих типов
Тип СТРОКА: способ сравнения зависит от национальных особенностей алфавита. Все символы, используемые в языке имеют свой порядковый номер, и строки сравниваются в соответствии с ним. Например "А" меньше чем "Б". "АБ" меньше чем "АВ", сначала платформа сравнивает первые символы "А", они равны, и переходит к следующим "Б" и "В", а по алфавиту "В" стоит позже, а значит значение больше, что и влияет на результат сравнения;
Тип ЧИСЛО: стандартные правила сравнения для чисел, 1 меньше чем 2 ;
Типа Булево: ИСТИНА больше значения ЛОЖЬ. Можно представить эти значения как Ложь - 0, Истина - 1 и больше;
Тип ДАТА: дата 01.01.2021 меньше чем дата 01.01.2022;
Тип Ссылка: сравнение происходит на основе значений уникальных идентификаторов ссылок;
Так же приведет к ошибке сравнение значений неограниченной длины:
Строки неограниченной длины,
ХранилищеЗначения,
Поле ТИПЗНАЧЕНИЯ из стандартных реквизитов таблицы ПланВидовХарактеристик.
809) Сравнение значений различных типов
В этом случае правила сравнения определяются приоритетом типов:
NULL (низкий приоритет);
Булево;
ЧИСЛО;
ДАТА;
СТРОКА;
Ссылка.
https://groxin.ru/lessons/pravila-sravnenija-znachenij/
820) Представление поля
Представление поля это значение поля преобразованное к строке. В платформе 1С есть множество сложных типов значений, которые для своего базового отображения поставляют функционал представлений.
К примеру возьмем тип Ссылка. Сама по себе ссылка это уникальный идентификатор хранящийся в базе в виде набора символов, например вот так "cc3f632e-d4e6-11ec-9252-1c1b0de598e0", пользователю эта информация ничего не даст, и нужно показывать ее в терминах бизнес-сущностей с которыми пользователь работает. Например, эту ссылку платформа 1С автоматически преобразует в "Поступление товаров и услуг 000000002 от 16.05.2022 10:30:32", это преобразование и называется получением представления объекта. Это представление мы видим, так как пытаемся вывести значение ссылки на экран. Но тип значения остается ссылочный, и обрабатывается в дальнейшем платформой соответственно. Внутри программного кода платформа оперирует всё тем же уникальным идентификатором. Потому если нам нужна ссылка только для вывода представления корректно будет получить его сразу в запросе.
Примеры
В языке запросов существует два способа получения представления поля:
Через точку с указанием поля Представление например:
ВЫБРАТЬ
Товары.Номенклатура.Представление КАК Номенклатура
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК Товары
С помощью функции ПРЕДСТАВЛЕНИЕ например:
ВЫБРАТЬ
Представление(Товары.Номенклатура) КАК Номенклатура
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК Товары
Применять функцию ПРЕДСТАВЛЕНИЕ можно и для ссылочных, и для примитивных типов. Получая представление ссылочных типов, результат будет полностью идентичен получению поля "Представление" от ссылки через точку. Примитивные типы (Строка, Число, Булево ....) преобразуются в строку как есть из значения, которое было передано в параметр функции.
Важно понимать разницу между функцией языка запросов ПРЕДСТАВЛЕНИЕ и полем Представление у ссылочных типов полей. В случае, когда в поле имеет составной тип данных и в нем могут использоваться и ссылочные типы и примитивные функция ПРЕДСТАВЛЕНИЕ сработает всегда, а получение представления из поля Представление для примитивных типов выдаст ошибку.
https://groxin.ru/lessons/predstavlenie-polja/
Приведение типов в языке запросов
При разработке часто возникают ситуации, когда нужное нам поле может принимать значения не только одного конкретного типа, например Справочник.Организации, а еще и Справочник.Контрагенты например. Такие поля называются полями составного типа. Так же часто возникают ситуации, когда нам необходимо обработать строку или число в запросе. Здесь функция ВЫРАЗИТЬ тоже поможет.
Стоит помнить, что функция ВЫРАЗИТЬ не может преобразовать из одного типа в другой, она работает только в рамках уже имеющегося описания типов для поля. К примеру у нас есть поле строкового типа длиной 500 символов. Мы не сможем преобразовать его в число, но сможем сделать из него строку длиной в 300 символов. Так же и с числом, строку из него мы не получим, но сможем изменить длину числа, и количество цифр после запятой.
Что касается составных типов то мы сможем только определить значение какого типа из набора мы хотим получить, это поможет нашему запросу работать быстрее, но приведения типов происходить не будет.
Синтаксис функции
ВЫРАЗИТЬ(<Выражение> КАК <Тип>), где <Выражение> это поле, которое мы хотим выразить. А <Тип> это тип, которым мы хотим выразить наше поле.
Также стоит отметить, что при указании несовместимого типа для выражения (отсутствующего в составном для выражения) система сообщит об ошибке.
Применение функции ВЫРАЗИТЬ разнообразно.
Например, при обращении к вложенным реквизитам через точку для полей составного типа функция ВЫРАЗИТЬ()
позволяет выполнить запрос оптимальным образом, отсеивая те значения, для которых необходимый реквизит предусмотрен.
Примеры
1. Укорачивание строки до 300 символов
ВЫБРАТЬ
ВЫРАЗИТЬ(Номенклатура.Комментарий КАК СТРОКА(300)) КАК Комментарий
ИЗ
Справочник.Номенклатура КАК Номенклатура
2. Оптимальное получение значения через точку, из поля составного типа.
ВЫБРАТЬ
ВЫРАЗИТЬ(ТоварыНаСкладах.Регистратор КАК Документ.ПоступлениеТоваровУслуг).Номер КАК НомерДокумента
ИЗ
РегистрНакопления.ТоварыНаСкладах КАК ТоварыНаСкладах
https://groxin.ru/lessons/privedenie-tipov-v-jazyke-zaprosov/
880) Псевдонимы (Алиасы) полей
Псевдонимом или алиасом (от английского слова alias) поля называется его представление в результате запроса. Платформа 1С может по умолчанию подставить псевдоним к полю, если он не указан явно.
Примеры
Например при запросе вида:
ВЫБРАТЬ
Код
ИЗ
Справочник.Номенклатура
мы получим результат
Код
10
11
3
...
Как видите нам не пришлось ничего дополнительно делать для того, чтобы задать имя поля в результате запроса, представление было сформировано автоматически. Но если мы хотим задать свое представление поля то мы можем воспользоваться ключевым словом "КАК" (AS), например
ВЫБРАТЬ
Код КАК КодНоменклатуры
ИЗ
Справочник.Номенклатура
Тогда в результате мы увидим следующее:
КодНоменклатуры
10
11
3
...
Псевдоним должен отвечать правилам наименования переменных 1С, начинаться с буквы, не содержать пробелов и нечитаемых символов
Так же, сейчас мы обращаемся к полю "Код" напрямую, без указания псевдонима таблицы. Когда мы выбираем данные из одной таблицы такой синтаксис приемлем, но при выборке из нескольких таблиц, мы обязательно должны использовать псевдонимы таблиц, чтобы платформа поняла из какой конкретно таблицы мы хотим получить поле, так как имена полей могут совпадать. Они работают точно так же как и псевдонимы полей, только после объявления псевдонима таблицы нужно будет добавить его перед именем поля. Например, вот так:
ВЫБРАТЬ
Номенклатура.Код КАК Код
ИЗ
Справочник.Номенклатура КАК Номенклатура
Так же следует помнить, что стандарт SQL позволяет задавать псевдонимы (алиасы) для полей без использования оператора КАК (AS). Для этого достаточно написать псевдоним поля через пробел и это будет аналогично использованию конструкции КАК. Запрос аналогичен запросу выше, но работать будет точно так же
ВЫБРАТЬ
Номенклатура.Код Код
ИЗ
Справочник.Номенклатура КАК Номенклатура
https://groxin.ru/lessons/psevdonimy-aliasy-polej/
933) Работа со строками в языке запросов
Существует несколько видов взаимодействия со строками в языке запросов 1С: конкатенация, выбор подстроки и сравнение.
Конкатенация
Конкатенация строк в языке запросов реализована с помощью оператора "+".
Пример:
ВЫБРАТЬ
"а" + "б" // Результат "аб"
или например сложим две строки, только одну получим из таблицы БД
ВЫБРАТЬ
"Товар: " + Номеклатура.Наименование КАК Наименование
Из Справочник.Номенклатура КАК Номеклатура
В результате получим все наименования из справочника Номенклатура, к которым вначале добавилась строка "Товар: ". Например "Товар: Coca-Cola".
или например сложим две строки, только одну строку получим выражением ПРАВ()
ВЫБРАТЬ
"Товар: " + Выразить(Прав(Номеклатура.Код,1) как строка(1)) КАК Наименование
Из Справочник.Номенклатура КАК Номеклатура
В результате получим сумму строки "Товар: " с последним символом кода номенклатуры. Например "Товар: 1".
Функции работы со строками
960) ПОДСТРОКА()
Функция для работы со строками ПОДСТРОКА позволяет выделить часть строки, указанной длины из исходной строки, начиная с указанной позиции.
Синтаксис функции ПОДСТРОКА:
ПОДСТРОКА(<Строка>, <НачальнаяПозиция>, <Длина>).
Строка - Исходная строка, последовательность символов, слово.
Начальная позиция - Номер первого символа части строки, которую хотим получить в результате. Следует учитывать, что нумерация символов в строке начинается с 1, так же можно использовать и числа меньше 1 для указания начальной позиции, но все они в результате работы функции будут приведены к 1.
Длина - Количество символов после начальной позиции, которые должны попасть в результат.
Пример:
ВЫБРАТЬ
ПОДСТРОКА("Привет, мир!", 9, 3) // Результат "мир"
В этом примере мы видим строку "Привет, мир!". Если подсчитать количество символов в ней, то мы можем убедиться что их 12
В функцию ПОДСТРОКА первым параметром мы передали наше строковое значение, вторым параметром указали номер символа - 9, с которого хотим начать часть строки, а третьим параметром указали сколько символов после начала так же должно попасть в результирующую подстроку - 3. В результате выполнения функции платформа вернет нам подстроку "мир".
978) Строка()
Функция преобразует в строку значения примитивных типов. При попытке преобразования в строку значения не примитивного типа будет выдана ошибка выполнения запроса. Так же при применении к значению NULL, в результате так же будет NULL.
В качестве примера преобразуем к строке число 42
ВЫБРАТЬ
СТРОКА(42) // Результат строка "42"
985) ДлинаСтроки()
Поддерживается только в платформе 1С версии 8.3.20.1549 и выше
Функция ДлинаСтроки возвращает количество символов в переданной строке в качестве значения.
Пример:
ВЫБРАТЬ
ДлинаСтроки("Привет, мир!") // Результат 12
995) СокрЛ()
Поддерживается только в платформе 1С версии 8.3.20.1549 и выше
Функция СокрЛ удаляет незначащие символы, которые находятся слева от первого значащего символа в переданном строковом значении. Под незначащими символами понимаются пробелы(обычный, неразрывный), символы табуляции, перевода каретки и т.д.
Пример, в исходной строке есть пробельные символы вначале:
ВЫБРАТЬ
СокрЛ(" Привет, мир!") // Результат "Привет, мир!"
1003) СокрП()
Поддерживается только в платформе 1С версии 8.3.20.1549 и выше
Функция СокрП удаляет незначащие символы, которые находятся справа от первого значащего символа в переданном строковом значении. Под незначащими символами понимаются пробелы(обычный, неразрывный), символы табуляции, перевода каретки и т.д.
Пример, в исходной строке есть пробельные символы в конце:
ВЫБРАТЬ
СокрП("Привет, мир! ") // Результат "Привет, мир!"
1011) СокрЛП()
Поддерживается только в платформе 1С версии 8.3.20.1549 и выше
Функция объединяет в себе две другие функции СокрЛ и СокрП, и удаляет незначащие символы стоящие перед первым значащим символом в строке и незначащие символы стоящие после последнего значащего символа в строке. Под незначащими символами понимаются пробелы(обычный, неразрывный), символы табуляции, перевода каретки и т.д.
Пример: в этой строке есть лишние пробелы вначале, середине и в конце. Пробелы слева и справа удалились, но в середине остались.
ВЫБРАТЬ
СокрЛП(" Привет, мир! ") // Результат "Привет, мир!"
1020) Лев()
Поддерживается только в платформе 1С версии 8.3.20.1549 и выше
Функция позволяет получить часть символов из строки, находящихся слева, по переданному количеству символов.
Синтаксис
Лев (Значение, ЧислоСимволов)
Пример, получим 6 символов с начала строки:
ВЫБРАТЬ
Лев("Привет, мир!", 6) // Результат "Привет"
1032) Прав()
Поддерживается только в платформе 1С версии 8.3.20.1549 и выше
Функция позволяет получить часть символов из строки, находящихся справа, по переданному количеству символов.
Синтаксис
Прав(Значение, ЧислоСимволов)
Пример, получим 4 символа с конца строки:
ВЫБРАТЬ
Прав("Привет, мир!", 4) // Результат "мир!"
1044) СтрНайти()
Поддерживается только в платформе 1С версии 8.3.20.1549 и выше
Функция производит поиск в строке и возвращает номер первого символа найденного вхождение искомой строки. Регистр при поиске не учитывается. Если ничего не найдено, то в результате вернется 0
Синтаксис
СтрНайти(СтроковоеЗначение, ИскомаяСтрока)
Пример:
ВЫБРАТЬ
СтрНайти("125435", "3"), // Результат "5"
СтрНайти("125435", "6") // Результат "0"
1058) ВРег()
Поддерживается только в платформе 1С версии 8.3.20.1549 и выше
Функция приводит все буквы содержащиеся в переданной строке в верхний регистр
Пример:
ВЫБРАТЬ
ВРег("Привет, мир!") // Результат "ПРИВЕТ, МИР!"
1067) НРег()
Поддерживается только в платформе 1С версии 8.3.20.1549 и выше
Функция приводит все буквы содержащиеся в переданной строке в нижний регистр
Пример:
ВЫБРАТЬ
НРег("Привет, мир!") // Результат "привет, мир!"
1076) СтрЗаменить()
Поддерживается только в платформе 1С версии 8.3.20.1549 и выше
Функция находит в переданном строковом значении все вхождения искомой строки и заменяет их на строку замены. Регистр не учитывается.
Синтаксис
СтрЗаменить(Строка, ПодстрокаПоиска, ПодстрокаЗамены)
Пример, заменим все буквы "р", на буквы "л":
ВЫБРАТЬ
СтрЗаменить("Привет, мир!", "р", "л") // Результат "Пливет, мил!"
1088) Сравнение строк
Сравнение строк может производится с помощью оператора "=". При сравнении регистр не учитывается.
Пример, сравним две строки:
ВЫБРАТЬ
"Привет" = "привет" // Результат Истина
1096) Оператор ПОДОБНО
Предназначен для сравнения строковых выражений с заданным шаблоном. Результатом такой проверки будет «Ложь» или «Истина». Отличие от оператора "=" заключается в возможности использования спецсимволов. Шаблон оператора ПОДОБНО задается с помощью специальных символов:
%(процент) - символ или последовательность символов, имеющая любое количество произвольных символов
_(подчеркивание) - один произвольный символ
[ ] (квадратные скобки) - позволяют указать один или несколько символов, один из которых может содержаться в искомой строке
СПЕЦСИМВОЛ - Позволяет использовать один из перечисленных спецсимволов, в качестве обычного символа, если такой символ имеется в строке.
Оператор ПОДОБНО можно использовать:
В полях выборки, как на примере выше
В условии ГДЕ
В конструкции ВЫБОР КОГДА
Синтаксис
<Строковое выражение> ПОДОБНО <"Шаблон">
Пример, определим, что переданное значение является почтовым адресом для хостинга mail.ru, в данной строке первым символом идет нижнее подчеркивание, и потому нам пришлось использовать СПЕЦСИМВОЛ, для того, чтобы иметь возможность описать нашу строку с помощью шаблона:
ВЫБРАТЬ
"_test@mail.ru" Подобно "\_%@mail.ru" СПЕЦСИМВОЛ "\" // Результат Истина
Пример, найдем все элементы справочника Номенклатура, содержащие слово "Фрукт" в названии:
ВЫБРАТЬ
Номенклатура.Ссылка КАК Товар
Из Справочник.Номенклатура КАК Номенклатура
ГДЕ Номенклатура.Наименование ПОДОБНО "%фрукт%"
Результатом будет набор элементов:
Товар
Фруктово-ореховая смесь
Фруктовый сок
https://groxin.ru/lessons/rabota-so-strokami-v-jazyke-zaprosov/
1131) ВЫБРАТЬ
Любой запрос начинается с предложения ВЫБРАТЬ. И оно же является единственным обязательным предложением любого запроса. Предложение ВЫБРАТЬ необходимо для того, чтобы указать какие поля мы хотим увидеть в результате запроса.
Если быть до конца точными, то для успешного выполнения запроса, в нем обязательно должна быть заполнена секция ВЫБРАТЬ, то есть помимо самого предложения ВЫБРАТЬ заполнено хотя бы одно поле выборки.
Пример самого короткого запроса
ВЫБРАТЬ
1
Результатом будет таблица состоящая из одной строки и одной колонки, с названием Поле1(если мы не указываем имя поля, то платформа 1С создаст его автоматически), и значением 1
Поле1
1
Выбираем все колонки (кроме виртуальных) из таблиц
Когда нам нужно получить все колонки из таблицы не обязательно всех их перечислять через запятую, а использовать оператор *, звездочка. Например:
обратимся к таблице справочника
ВЫБРАТЬ * ИЗ Справочник.Номенклатура
Результатом будет следующая таблица (количество строк будет равняться количеству записей в таблице, здесь для примера выведено две). Полей в таблице гораздо больше, но чтобы не занимать экран показано всего несколько.
Ссылка Код ПометкаУдаления ... ИмяПредопределенныхДанных
Coca-Cola 10 Нет ...
Салфетки белые 11 Нет ...
Примечание: Предложение ИЗ в языке запросов тоже не обязательно, в том случае если описание поля содержит полный путь к нему с указанием таблицы-источника, например предыдущий запрос можно было бы написать в таком стиле
ВЫБРАТЬ Справочник.Номенклатура.*
Результат будет идентичен
#Выбираем только определенные поля из таблицы
Наиболее часто используемым способом будет перечисление нескольких полей из таблицы-источника запроса через запятую, тогда в результате мы увидим только их.
Обращение к таблице документа
ВЫБРАТЬ
ПоступлениеТоваровУслуг.Номер КАК Номер,
ПоступлениеТоваровУслуг.Дата КАК Дата,
ПоступлениеТоваровУслуг.Контрагент КАК Контрагент
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
Результатом будет
Номер Дата Контрагент
1 13.05.2022 9:51:06 ООО "Найдется все"
2 16.05.2022 10:30:32 ООО "ВЕЗУНКОВ"
3 16.05.2022 10:30:41 ООО "Найдется все"
#Виртуальные поля
В некоторых таблицах-источниках присутствуют так называемые "Виртуальные поля"- "Представление" для справочников, "МоментВремени" для документов и т.д. Они называются виртуальными, потому что не хранятся в базе данных, и вычисляются только в момент запроса к ним. Виртуальные поля нельзя получить через оператор получения всех полей таблицы *, звездочку, можно только если указать их явно. Это сделано для ускорения выполнения запросов с использованием звездочки.
Например, получим все не виртуальные поля через звездочку, и добавим в выборку виртуальные поля
ВЫБРАТЬ
*,
ПоступлениеТоваровУслуг.Представление КАК Представление,
ПоступлениеТоваровУслуг.МоментВремени КАК МоментВремени
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
Результатом будем таблица содержащая все поля и вложенные таблицы документа. Остальные поля скрыты для повышения читаемости таблицы
Ссылка ... Представление МоментВремени
Поступление товаров услуг 000000001 от 13.05.2022 9:51:06 ... Поступление товаров услуг 000000001 от 13.05.2022 9:51:06 13.05.2022 9:51:06; Поступление товаров услуг 000000001 от 13.05.2022 9:51:06
Поступление товаров услуг 000000002 от 16.05.2022 10:30:32 ... Поступление товаров услуг 000000002 от 16.05.2022 10:30:32 16.05.2022 10:30:32; Поступление товаров услуг 000000002 от 16.05.2022 10:30:32
Поступление товаров услуг 000000003 от 16.05.2022 10:30:41 ... Поступление товаров услуг 000000003 от 16.05.2022 10:30:41 16.05.2022 10:30:41; Поступление товаров услуг 000000003 от 16.05.2022 10:30:41
https://groxin.ru/lessons/vybrat/
1202) ИТОГИ ПО
Описание
Итоги - это значения полей запроса вычисленные с помощью агрегатных функций для переданного набора данных. Выводятся в результате запроса отдельными строками.
Например, у нас есть следующий набор данных:
Номенклатура Количество
Яблоко 1
Яблоко 3
Апельсин 2
Апельсин 4
Необходимо вычислить сколько всего яблок и апельсинов есть в этом наборе. А так же хотим узнать общее количество фруктов.
Применив следующий запрос, мы можем удовлетворить всем требованиям:
ВЫБРАТЬ
ТаблицаТоваров.Номенклатура КАК Номенклатура,
ТаблицаТоваров.Количество КАК Количество
ИЗ
ТаблицаТоваров КАК ТаблицаТоваров
ИТОГИ
СУММА(Количество)
ПО
ОБЩИЕ,
Номенклатура
В результате мы получим следующую древовидную структуру:
Номенклатура Количество
10
Яблоко 4
Яблоко 1
Яблоко 3
Апельсин 6
Апельсин 2
Апельсин 4
Так как в запросе, в секции ИТОГИ ПО присутствует ключевое слово "ОБЩИЕ" в первой строке мы видим пустое значение поля "Номенклатура" и общую сумму количества фруктов из набора данных. Это сумма значений по всем строкам.
Далее мы видим Итоги по значению поля "Номенклатура" с вложенными в них строками детальных записей, из которых и получилось итоговое значение для каждой итоговой записи.
Теперь перейдем к более подробному описанию и синтаксису секции ИТОГИ:
ИТОГИ Список полей с агрегатными функциями ПО ОБЩИЕ и/или список полей (контрольных точек) по которым считаются итоги
Итоги будут рассчитаны по каждой комбинации полей после ключевого слова ПО, и добавлены в результат запроса как отдельные итоговые строки.
Если поле, по которому рассчитываются итоги, содержит ссылку на справочник, можно рассчитать итоги с использованием иерархии справочника. Подробнее можно почитать в статье про Итоги по иерархии.
При расчете итогов по полям которые являются субконто регистра бухгалтерии, то значения NULL в итогах игнорируются.
https://groxin.ru/lessons/itogi-po/
1252) Ключевое слово РАЗЛИЧНЫЕ
Описание
Ключевое слово РАЗЛИЧНЫЕ в тексте запроса позволяет отобрать уникальный набор записей выборки.
#Примеры
Например, если необходимо произвести выборку списка номенклатуры, встречающейся в табличной части "Товары" документов "Поступление товаров и услуг", можно выполнить следующий запрос:
ВЫБРАТЬ РАЗЛИЧНЫЕ
Номенклатура
ИЗ Документ.ПоступлениеТоваровУслуг.Товары
Конструкция РАЗЛИЧНЫЕ не может использоваться совместно с выборкой значений полей, содержащих вложенные таблицы (данные табличных частей).
В данном случае Товары это табличная часть (вложенная таблица) и такая конструкция вызовет ошибку
ВЫБРАТЬ РАЗЛИЧНЫЕ
Ссылка,
Товары
ИЗ Документ.ПоступлениеТоваровУслуг
https://groxin.ru/lessons/kljuchevoe-slovo-razlichnye/
1273) Конструкция языка запросов ГДЕ
Конструкция языка запросов ГДЕ позволяет наложить отбор на получаемые данные.
Синтаксис следующий:
ГДЕ <Условие>, в котором <Условие> - логическое выражение, определяющее отбор.
#Пример
Мы хотим выбрать все документы ПоступлениеТоваровУслуг, где значения поля Дата больше чем 14-ое мая
ВЫБРАТЬ
ПоступлениеТоваровУслуг.Ссылка КАК Ссылка
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
ГДЕ
ПоступлениеТоваровУслуг.Дата >= ДАТАВРЕМЯ(2022, 5, 14)
Результат:
Ссылка
Поступление товаров услуг 000000002 от 16.05.2022 10:30:32
Поступление товаров услуг 000000003 от 16.05.2022 10:30:41
1296) Оператор ИМЕЮЩИЕ
Операртор ИМЕЮЩИЕ - работает аналогично оператору ГДЕ, но накладывает отбор не на значения полей таблицы, а на результат выполнения агрегатных функций. Так как использование оператора ИМЕЮЩИЕ подразумевает использование агрегатных функций, то запрос так же должен содержать и оператор СГРУППИРОВАТЬ ПО, в котором должны быть перечислены все поля не использующиеся в агрегатных функциях. Следует так же учитывать, что результат запроса так же будет сгруппирован.
Пример синтаксиса:
ВЫБРАТЬ
Таблица .Ссылка КАК Ссылка
ИЗ
Таблица КАК Таблица
СГРУППИРОВАТЬ ПО
Таблица .Ссылка
ИМЕЮЩИЕ МИНИМУМ(*) > 1
Теперь к примерам. В языке запросов 1С есть возможность агрегирования данных, с помощью агрегатных функций. С помощью них мы можем вычислить например сумму всех элементов в колонке таблицы, или найти максимальное значение.
Но иногда у нас возникает необходимость использовать результат агрегатной функции в отборе. Например мы хотим найти всех производителей, у которых есть более двух моделей диванов.
Без использования оператора ИМЕЮЩИЕ нам придется выполнить два запроса, иначе никак.
В первом мы найдем сначала среднее значение цены. А во втором будем делать отбор по этому значению:
ВЫБРАТЬ
ПроизводителиСКоличеством.Производитель КАК Производитель
ИЗ
(
ВЫБРАТЬ
Диваны.Производитель КАК Производитель,
КОЛИЧЕСТВО(*) КАК Количество
ИЗ
Справочник.Диваны КАК Диваны
СГРУППИРОВАТЬ ПО
Диваны.Производитель
) КАК ПроизводителиСКоличеством
ГДЕ
ПроизводителиСКоличеством.Количество > 2
Здесь мы использовали получение данных из вложенного запроса. Выглядит довольно сложно и требует получения данных в два приема.
Чтобы немного упростить чтение и отладку этого решения можно было бы использовать временную таблицу. Но это тоже заставляет писать довольно большой запрос:
ВЫБРАТЬ
Диваны.Производитель КАК Производитель,
КОЛИЧЕСТВО(*) КАК Количество
ПОМЕСТИТЬ ВТПроизводителиСКоличеством
ИЗ
Справочник.Диваны КАК Диваны
СГРУППИРОВАТЬ ПО
Диваны.Производитель
;
ВЫБРАТЬ
ПроизводителиСКоличеством.Производитель КАК Производитель
ИЗ
ВТПроизводителиСКоличеством КАК ПроизводителиСКоличеством
ГДЕ
ПроизводителиСКоличеством.Количество > 2
Все равно мы не смогли избавиться от получения данных в два приема, хоть читать запрос и стало несколько проще.
Здесь нам на помощь и приходит оператор ИМЕЮЩИЕ
С помощью него мы можем получить тот же результат за меньшее количество действий
ВЫБРАТЬ
Диваны.Производитель КАК Производитель
ИЗ
Справочник.Диваны КАК Диваны
СГРУППИРОВАТЬ ПО
Диваны.Производитель
ИМЕЮЩИЕ КОЛИЧЕСТВО(*) > 2
С помощью такого лаконичного запроса можно получить тот же самый результат.
https://groxin.ru/lessons/operator-imejuschie/
1366) Секция "ИЗ"
Секция ИЗ используется для указания СУБД из какой таблицы мы будем выбирать данные.
В простом случае выборки из одной таблицы в секции ИЗ указывается только её имя и псевдоним, если он нужен.
#Примеры
ВЫБРАТЬ
Ссылка,
Наименование
Из Справочник.Номенклатура
В более сложных случаях секция из может содержать соединения и условия соединений. Подробнее можно прочитать в статье Соединения.
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка,
Номенклатура.Наименование КАК Наименование,
ЕдиницыИзмерения.Наименование КАК ЕдиницаИзмеренияНаименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ЕдиницыИзмерения КАК ЕдиницыИзмерения
ПО Номенклатура.ЕдиницаИзмерения = ЕдиницыИзмерения.Ссылка
https://groxin.ru/lessons/sektsija-iz/
1387) Упорядочить
В языке запросов 1С для сортировки записей используется секция УПОРЯДОЧИТЬ ПО, в ней указываются поля, по которым необходимо произвести сортировку, а также тип сортировки (по убыванию и по возрастанию). Для задания способа сортировки необходимо указать ключевые слова Возр (можно не указывать, используется по умолчанию) или Убыв возле конкретного поля
#Пример
ВЫБРАТЬ
Номенклатура.Ссылка КАК Ссылка
ИЗ
Справочник.Номенклатура КАК Номенклатура
УПОРЯДОЧИТЬ ПО
Номенклатура.Наименование УБЫВ
В результате мы увидим отсортированные по алфавиту значения
Ссылка
Яблоки
Фруктовый сок
Фруктово-ореховая смесь
Салфетки белые
Салфетки
Прочее
Продукты
Напитки
Клубника
Апельсины
Coca-Cola
Стоит быть внимательным, потому что не все типы значений полей могут иметь очевидный результат сортировки.
В текущем примере мы сортировали по имени, которое хранится в виде строки, но если бы мы сортировались по полю Ссылка, являющееся полем ссылочного типа, то сортировка получилась бы совершенно иной. Хоть мы и видим в результате те же названия, представления, номенклатуры, что и до этого сортировка производится по внутреннему значению ссылки, уникальному идентификатору, и является скорее величиной показывающей порядок назначения этих идентификаторов, чем что-то осмысленное.
https://groxin.ru/lessons/uporjadochit/
1416) Соединения в запросе
Переходя к более сложным запросам, вы неизбежно столкнетесь с необходимостью использовать более чем одну таблицу базы данных в одном запросе. Эта возможность языка запросов является одной из самых востребованных в процессе разработки. Использовать несколько источников данных можно с помощью двух основных операторов Соединение и Объединение. Сейчас мы подробнее остановимся на соединениях, а объединения рассмотрим в отдельной статье Объединения.
Секция ИЗ в запросе предоставляет возможность нескольких вариантов использования соединений.
Условимся что у нас есть две вот такие таблицы с данными:
В базе данных хранится таблица Фрукты, в которой мы храним названия фруктов и их количество. И таблица Цвета фруктов, в которой хранится цвет для фруктов, но не для всех.
Фрукты Цвета фруктов
НазваниеКоличествоЯблоко 5 Апельсин 6 Банан 12 ФруктЦветЯблоко Зеленый Банан Желтый
#Левое соединение
Один из самых распространенных вариантов соединения Левое соединение. Синтаксис этой конструкции имеет следующий вид:
<Таблица1> Левое Соединение <Таблица2>
ПО <УсловиеСоединения>
И|ИЛИ <Еще одно условие соединения>.
Количество условий соединений не ограничено.
В этом варианте соединения следует запомнить основное правило, к Таблица1 присоединяется Таблица2. Таблица1 при этом остается в исходном виде, а из Таблица2 в результат попадают только те записи, которые соответствуют условию соединения после оператора ПО.
Взяв таблицы Фрукты, ЦветаФруктов и использовав оператор Левое Соединение мы можем добиться следующего результата.
ВЫБРАТЬ
Фрукты.Название,
Фрукты.Количество,
ЦветаФруктов.Цвет
ИЗ
Фрукты КАК Фрукты
ЛЕВОЕ СОЕДИНЕНИЕ ЦветаФруктов КАК ЦветаФруктов
ПО Фрукты.Название = ЦветаФруктов.Фрукт
Результат:
Название Количество Цвет
Яблоко 5 Зеленый
Апельсин 6 NULL
Банан 12 Желтый
Как видим таблица Фрукты осталась в исходном виде, а из таблицы Цвет фруктов в результат попали только значения, которые есть в таблице Фрукты. Значения тех полей, которые не нашли соответствия в присоединяемой таблице, не присоединились, заполняются значением NULL.
Так же можно представить это соединение в графическом виде
#Правое соединение
Синтаксис этой конструкции имеет следующий вид:
<Таблица1> Правое Соединение <Таблица2>
ПО <УсловиеСоединения>
И|ИЛИ <Еще одно условие соединения>.
Этот вариант соединения аналогичен левому соединению, с единственным отличием, здесь Таблица1 будет присоединяться к Таблица2.
Пример запроса:
ВЫБРАТЬ
Фрукты.Название,
Фрукты.Количество,
ЦветаФруктов.Цвет
ИЗ
Фрукты КАК Фрукты
ПРАВОЕ СОЕДИНЕНИЕ ЦветаФруктов КАК ЦветаФруктов
ПО Фрукты.Название = ЦветаФруктов.Фрукт
Результат:
Название Количество Цвет
Яблоко 5 Зеленый
Банан 12 Желтый
Так как теперь основной таблицей соединения является таблица Цвета фруктов, то и результат видим соответствующий, в таблице цветов у нас всего две строки, и она осталась неизменной, и к ней присоединилась таблица Фрукты только теми записями, которые соответствуют условию.
Так же это соединение можно представить в графическом виде
Следует помнить, что при написании запросов в конструкторе запросов 1С, он автоматически заменяет правое соединение на левое, меняя таблицы местами. Это не влияет на результат, и никак не мешает, следует это просто помнить, чтобы не удивляться почему мы писали правое, а потом оно стало левым)
#Внутреннее соединение
Внутреннее соединение имеет похожий синтаксис:
<Таблица1> Внутреннее Соединение <Таблица2>
ПО <УсловиеСоединения>
И|ИЛИ <Еще одно условие соединения>,
но в результате соединения в результат попадают только записи соотвествующие условию в обеих таблицах.
Добавим в таблицу цветов фруктов еще одну запись, чтобы увидеть результат более наглядно
Фрукт Цвет
Яблоко Зеленый
Банан Желтый
Кокос Коричневый
ВЫБРАТЬ
Фрукты.Название,
Фрукты.Количество,
ЦветаФруктов.Цвет
ИЗ
Фрукты КАК Фрукты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ЦветаФруктов КАК ЦветаФруктов
ПО Фрукты.Название = ЦветаФруктов.Фрукт
Результат:
Название Количество Цвет
Яблоко 5 Зеленый
Банан 12 Желтый
Как видим результат явно показывает, что остались только те записи из обеих таблиц, которые соответствуют условию.
Графически это можно изобразить так:
#Полное соединение
Синтаксис полного соединения:
<Таблица1> Полное Соединение <Таблица2>
ПО <УсловиеСоединения>
И|ИЛИ <Еще одно условие соединения>.
Это соединение позволяет нам показать все записи из обеих таблиц, но соединить те, которые соответствуют условию.
Рассмотрим пример запроса:
ВЫБРАТЬ
Фрукты.Название,
Фрукты.Количество,
ЦветаФруктов.Цвет
ИЗ
Фрукты КАК Фрукты
ПОЛНОЕ СОЕДИНЕНИЕ ЦветаФруктов КАК ЦветаФруктов
ПО Фрукты.Название = ЦветаФруктов.Фрукт
Результат:
Название Количество Цвет
Яблоко 5 Зеленый
Апельсин 6 NULL
Банан 12 Желтый
NULL NULL Коричневый
Как видим, результат содержит данные из обеих таблиц, и так же те записи которые соответствуют условию успешно соединились. Те значения, которые не были получены из соединения заполнены значением NULL
Графически это можно изобразить вот так
#Перекрестное соединение (Декартово произведение)
В самом простом, и редко используемом варианте соединения мы можем перечислить необходимые таблицы через запятую. Рассмотрим пример.
Запрос может выглядеть следующим образом:
ВЫБРАТЬ
Фрукты.Название,
Фрукты.Количество,
ЦветаФруктов.Цвет
ИЗ
Фрукты КАК Фрукты,
ЦветаФруктов КАК ЦветаФруктов
Результат будет следующий:
Название Количество Цвет
Яблоко 5 Зеленый
Яблоко 5 Желтый
Апельсин 6 Зеленый
Апельсин 6 Желтый
Банан 12 Зеленый
Банан 12 Желтый
Как видно, мы получили данные из двух таблиц в одном запросе, но соединились они довольно странно. Каждая запись из одной таблицы соединилась с каждой записью из другой таблицы, результат получился не корректный. Математика такого результата крайне проста, если знать как перемножаются матрицы. В самом простом объяснении можно сказать, что если в одной таблице 3 записи и в другой таблице 2 записи, то количество строк в результате будет 3*2 = 6. Пока что ценности в этом немного. Обычно такие соединения используют одновременно с отбором в секции ГДЕ. Мы видим, что в обеих таблицах есть поля с одинаковыми значениями Название и Фрукт. Если мы добавим условие на равенство этих полей, то запрос получится следующим:
ВЫБРАТЬ
Фрукты.Название,
Фрукты.Количество,
ЦветаФруктов.Цвет
ИЗ
Фрукты КАК Фрукты,
ЦветаФруктов КАК ЦветаФруктов
ГДЕ
Фрукты.Название = ЦветаФруктов.Фрукт
А результат удовлетворит нашим ожиданиям, цвета фруктов соответствуют фруктам:
Название Количество Цвет
Яблоко 5 Зеленый
Банан 12 Желтый
Такой вариант использования соединений хоть в целом и работоспособен, но крайне плохо показывает себя при большом количестве данных в таблицах. Запрос будет работать гораздо медленнее чем при использовании других видов соединений. Так же при этом соединении мы потеряли часть данных по апельсинам из таблицы фруктов. А значит в результате запроса остались только фрукты которые есть в обеих таблицах. Этот результат будет аналогичен внутреннему соединению.
#Дополнительные примеры использования
#Множественные условия в соединении.
Выведутся все записи из таблицы Фрукты, но из таблицы цветов присоединится только цвет для записи "Яблоко":
ВЫБРАТЬ
Фрукты.Название,
Фрукты.Количество,
ЦветаФруктов.Цвет
ИЗ
Фрукты КАК Фрукты
ЛЕВОЕ СОЕДИНЕНИЕ ЦветаФруктов КАК ЦветаФруктов
ПО Фрукты.Название = ЦветаФруктов.Фрукт
И Фрукты.Название = "Яблоко"
Результат:
Название Количество Цвет
Яблоко 5 Зеленый
Апельсин 6 NULL
Банан 12 NULL
#Множественные соединения в запросе
Присоединим к нашей таблице Фрукты еще одну таблицу, которая содержит цены фруктов. В результате получим еще одну колонку, содержащую цены
ВЫБРАТЬ
Фрукты.Название,
Фрукты.Количество,
ЦветаФруктов.Цвет,
ЦеныФруктов.Цена
ИЗ
Фрукты КАК Фрукты
ЛЕВОЕ СОЕДИНЕНИЕ ЦветаФруктов КАК ЦветаФруктов
ПО Фрукты.Название = ЦветаФруктов.Фрукт
ЛЕВОЕ СОЕДИНЕНИЕ ЦеныФруктов КАК ЦеныФруктов
ПО Фрукты.Название = ЦеныФруктов.Фрукт
Результат:
Название Количество Цвет Цена
Яблоко 5 Зеленый 50
Апельсин 6 NULL 60
Банан 12 Желтый 70
https://groxin.ru/lessons/soedinenija-v-zaprose/
1625) Документы
Обращение к таблицам документов производится с помощью синтаксиса
Документ.<НазваниеДокумента>
Например обращение к таблице документов ПоступлениеТоваровУслуг будет выглядеть так:
ВЫБРАТЬ
Поступления.Номер КАК НомерДокумента
ИЗ
Документ.ПоступлениеТоваровУслуг КАК Поступления
В запросе к таблицам документов доступно использование стандартных реквизитов, которые есть у каждого документа:
Ссылка - Уникальный идентификатор документа. Позволяет однозначно определить конкретный документ.
Номер - Номер документа. В зависимости от настроек может быть Строкой или Числом
Дата - Содержит дату записи документа.
Проведен - Истина или Ложь. Проведение документа означает, что он не только записан, но и мог создать записи в других таблицах базы данных (движения).
ПометкаУдаления - Истина или Ложь. Отображает информацию о том, что документ подготовлен к удалению. Метка, что документ не следует использовать для каких либо действий.
Также в запросах к таблицам документов доступны следующие служебные реквизиты:
МоментВремени - содержит комбинацию значений полей Ссылка и Дата, для более точного определения момента записи и проведения документа.
Представление - Строковое представление документа, по умолчанию содержит название документа номер и дату в виде "Документ такой-то №1 от 01.01.2020"
Так же документы в платформе 1С могут содержать вложенные таблицы - ТабличныеЧасти. Например, в документе ПоступлениеТоваровУслуг, есть табличная часть Товары, в хранящей информацию о конкретных товарах, которые добавляются в базу данных. Она выступает своего рода промежуточным хранилищем данных в котором мы регистрируем данные события "Поступление товаров" в том виде, в котором оно произошло.
Для обращения к данным табличной части необходимо использовать следующий синтаксис Документ.ПоступлениеТоваровУслуг.Товары
ВЫБРАТЬ
ПоступлениеТоваровУслугТовары.Ссылка,
ПоступлениеТоваровУслугТовары.НомерСтроки,
ПоступлениеТоваровУслугТовары.Номенклатура,
ПоступлениеТоваровУслугТовары.Количество,
ПоступлениеТоваровУслугТовары.Сумма
ИЗ
Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары
Табличные части документа так же имеют стандартные реквизиты, которые есть в любой табличной части
Ссылка - Уникальный идентификатор документа, с которым связана строка табличной части.
НомерСтроки - Порядковый номер строки табличной части
Чтобы узнать полный список реквизитов и табличных частей документов - используйте Схему базы данных
1663) Справочники
Обращение к таблицам справочников производится с помощью синтаксиса
Справочник.<НазваниеСправочника>
Например обращение к таблице справочника Номенклатура будет выглядеть так:
ВЫБРАТЬ
Номенклатура.Наименование КАК НаименованиеНоменклатуры
ИЗ
Справочник.Номенклатура КАК Номенклатура
В запросе к таблицам справочников доступно использование стандартных реквизитов, какие-то есть всегда, а некоторые зависят от настроек объекта:
Владелец (опциональный) - Актуально для подчиненных справочников. Содержит ссылку на элемент другого справочника, который является владельцем текущего элемента.
Код (опциональный) - Порядковый номер элемента справочника, может быть представлен строкой или числом. Может быть отключен для справочника целиком.
Наименование (опциональный) - Имя элемента справочника. Тоже может быть отключено для справочника целиком.
ПометкаУдаления - Истина или Ложь. Отображает информацию о том, что элемент справочника подготовлен к удалению. Метка, что элемент справочника не следует использовать для каких либо действий.
Предопределенный - Указывает на то, что текущий элемент справочника предопределен разработчиком конфигурации, а не создан пользователем.
Представление - Строковое представление элемента справочника, по умолчанию содержит Код или Наименование элемента справочника.
Родитель (опционально) - Актуально для справочников поддерживающих иерархию. Содержит ссылку на родительский элемент справочника
Ссылка - Уникальный идентификатор элемента справочника. Позволяет однозначно определить конкретный элемент.
ЭтоГруппа (опционально) - Истина или Ложь. Актуально для справочников поддерживающих иерархию групп. Указывает - является ли элемент справочника обычным элементом или группой.
Так же справочники в платформе 1С могут содержать вложенные таблицы - ТабличныеЧасти. Например, в справочнике Контрагенты, есть табличная часть КонтактныеЛица, в которой хранится информация о контактных лицах контрагента.
Для обращения к данным табличной части необходимо использовать следующий синтаксис
Справочник.Контагенты.<НазваниеТабличнойЧасти>
ВЫБРАТЬ
КонтрагентыКонтактныеЛица.Ссылка,
КонтрагентыКонтактныеЛица.НомерСтроки,
КонтрагентыКонтактныеЛица.ФИО,
КонтрагентыКонтактныеЛица.Email
ИЗ
Справочник.Контрагенты.КонтактныеЛица КАК КонтрагентыКонтактныеЛица
Табличные части справочника так же имеют стандартные реквизиты, которые есть в любой табличной части
Ссылка - Уникальный идентификатор элемента справочника, с которым связана строка табличной части.
НомерСтроки - Порядковый номер строки табличной части
Чтобы узнать полный список реквизитов и табличных частей справочников - используйте Схему базы данных
https://groxin.ru/lessons/spravochniki/
1702) Таблицы констант
Среди метаданных доступных в платформе 1С существует отдельный вид объектов Константы. Это специализированные сущности, для хранения редко изменяющихся единичных значений. К примеру ОсновнаяВалютаУчета. Валюта учета меняется крайне редко и для хранения таких значений и существуют константы. Каждая константа имеет своё имя по которому мы можем обращаться к ней из кода и языка запросов. Но при этом все константы хранятся в отдельной таблице. Используя эти знания мы можем получить как все значения разом, так и значение каждой константы по отдельности.
#Примеры
Получаем все доступные константы из таблицы констант:
ВЫБРАТЬ
*
ИЗ
Константы КАК Константы
Результат:
ДатаЗапретаРедактирования ОсновнаяОрганизация
16.05.2022 14:43:26 ООО "Эксперт"
Получаем константу по имени:
ВЫБРАТЬ
ОсновнаяОрганизация.Значение КАК ЗначениеКонстанты
ИЗ
Константа.ОсновнаяОрганизация КАК ОсновнаяОрганизация
Результат:
ЗначениеКонстанты
ООО "Эксперт"
https://groxin.ru/lessons/tablitsy-konstant/
1730) ТИПЗНАЧЕНИЯ и ТИП
В языке запросов 1С встроено две функции позволяющие работать с типами данных.
ТИПЗНАЧЕНИЯ(<Выражение>) - Необходимо для определения типа переданного в качестве параметра значения
ТИП(<Тип>) - Используется в условиях на проверку типа, позволяет установить необходимое значение типа.
Например, у нас возникла необходимость проверить, является ли переданное значение числом.
ВЫБРАТЬ
ТИП(Число) = ТИПЗНАЧЕНИЯ(25)
Результатом будет значение ИСТИНА, так как 25 является числом.
https://groxin.ru/lessons/tipznachenija-i-tip/
Условный оператор в запросе
Оператор ВЫБОР используется в случаях когда нам необходимо различное поведение в зависимости от возникших условий.
#Примеры
К примеру, если значение поля Дата выпадает на день программиста (256-ой день в году), или на 31-ое декабря то выведем соответствующее поздравление. А если на любое другое число, выведем что нибудь нейтральное.
ВЫБРАТЬ
ВЫБОР
КОГДА ДЕНЬГОДА(&ТекущаяДата) = 256
ТОГДА "Поздравляю с днем программиста!"
КОГДА МЕСЯЦ(&ТекущаяДата) = 12
И ДЕНЬ(&ТекущаяДата) = 31
ТОГДА "Поздравляю с наступающим новым годом!"
ИНАЧЕ "Сегодня нет праздника"
КОНЕЦ КАК Сообщение
Синтаксис оператора ВЫБОР:
ВЫБОР
КОГДА <ЛогическоеВыражение> ТОГДА <ВыражениеДляИстина>
ИНАЧЕ <ВыражениеДляЛожь>
КОНЕЦ
В рамках операции ВЫБОР может быть описано какое угодно количество логических условий "КОГДА .... ТОГДА...." в том числе и вложенных.
Так же существует и второй вариант синтаксиса, когда мы хотим проверить элементы только на равенство, не используя других функций и операторов сравнения.
Мы можем указать сравниваемое значение прямо после слова "ВЫБОР", а в когда помещать сами значения. К примеру у нас есть значение количества в таблице, и мы хотим с помощью запроса определить, что количество товара равно 1 и пометить эти строки в результате запроса:
ВЫБРАТЬ
Товары.Товар КАК Товар,
Товары.Количество КАК Количество,
ВЫБОР Товары.Количество
КОГДА 1
ТОГДА "Вы заказали всего 1 товар"
ИНАЧЕ "Спасибо за заказ!"
КОНЕЦ КАК Сообщение
ИЗ
Товары КАК Товары
В результате мы можем получить следующий набор данных:
Товар Количество Сообщение
Апельсин 1 Вы заказали всего 1 товар
Яблоко 20 Спасибо за заказ!
Роза 13 Спасибо за заказ!
https://groxin.ru/lessons/uslovnyj-operator-v-zaprose/
1788) Устройство базы данных 1С
Метаданные, в контексте 1С, это составные части конфигурации: Документы, Справочники, Регистры, Константы и т.д., которые в конечном счете, после преобразования платформой обретают свое представление в виде таблиц базы данных (БД). Названия таблиц которые используются в запросах платформа генерирует автоматически, на основе типа метаданных, например "Справочники", и названия объекта заданного в конфигураторе. Например в дереве метаданных нашей конфигурации мы можем увидеть нечто подобное
Здесь стоит запомнить, правило формирования этих псевдонимов:
<Название типа метаданных в единственном числе>.<Название объекта метаданных>, и для того чтобы обратиться к таблице справочника "Номенклатура" в запросе мы должны будем написать в секции "ИЗ Справочник.Номенклатура".
Полный список метаданных используемых в нашем тренажере можно перейдя по ссылке "Схема БД" или по ссылке, которая есть в каждой задаче.
#Обращение к таблицам в запросе
Исходя из описания выше, мы получили представление о формировании имен таблиц. Соответственно для получения данных это имя должно быть полностью подставлено в блок ИЗ (FROM) в тексте запроса. Например, следующий запрос вернет все колонки и строки из таблицы "Справочник.Номенклатура"
ВЫБРАТЬ *
ИЗ Справочник.Номенклатура
#В каком виде данные хранятся в БД
Так как 1С использует SQL системы управления базами данных (SQL СУБД), то все данные хранящиеся в них представлены в виде таблиц. У таблиц есть два главных свойства это "Строки" и "Колонки", колонки еще иногда называют "Поля".
ВЫБРАТЬ
Ссылка,
ПометкаУдаления,
Родитель,
ЭтоГруппа,
Код,
Наименование
ИЗ Справочник.Номенклатура
Результат такого запроса будет выглядеть примерно следующим образом:
Ссылка ПометкаУдаления Родитель ЭтоГруппа Код Наименование
Салфетки белые Нет Прочее Нет 11 Салфетки белые
Клубника Нет Продукты Нет 3 Клубника
Продукты Нет Да 4 Продукты
Прочее Нет Да 5 Прочее
Салфетки Нет Прочее Нет 6 Салфетки
Где Ссылка, ПометкаУдаления, Родитель и т.д. это колонки таблицы, а в строках, мы видим значения этих колонок. Каждая строка таблицы это отдельная запись, или как в нашем случае отдельный элемент справочника. Глядя на этот результат запроса, мы можем утверждать, что в справочнике Номенклатура у нас хранится 5 записей.
Так же вы можете обратить внимание, что в большинстве запросов, к таблицам справочников, значения полей Ссылка и Наименование на первый взгляд совпадают. Это особенность нашего тренажера. В базе данных поле ссылка имеет значение в виде набора символов (Уникального идентификатора), но для того чтобы не сбивать с толку и приблизить внешний вид результат запроса к внешнему виду результата запроса в 1С, мы отображаем представление ссылки, а оно в 1С по умолчанию совпадает с Наименованием элемента справочника. Мы учитываем это поведение в момент проверки и хоть они внешне очень похожи, но фактически это разные типы данных и механизм проверки об этом знает. Потому все проверки работают корректно, и заменить ссылку на наименование нельзя.
https://groxin.ru/lessons/ustrojstvo-bazy-dannyh-1s/
1829) Функции для работы с датами в языке запросов
Для работы со значениями типа ДАТАВРЕМЯ в системе представлен целый ряд функций и операторов.
Для всех примеров поле Дата = 31.12.2021 23:59:00
#Выделение частей даты:
Для выделения частей даты представлены следующие функции:
#Год
ГОД(<Дата>) - возвращает значение года даты
Возвращаемое значение: Число
Пример:
ГОД(Дата) // Результат - 2021
#Квартал
КВАРТАЛ(<Дата>) - возвращает номер квартала даты
Возвращаемое значение: Число
Пример:
КВАРТАЛ(Дата) // Результат - 4
#Месяц
МЕСЯЦ(<Дата>) - возвращает номер месяца даты
Возвращаемое значение: Число
Пример:
МЕСЯЦ(Дата) // Результат - 12
#ДеньГода
ДЕНЬГОДА(<Дата>) - возвращает порядковый номер дня в году для указанной даты
Возвращаемое значение: Число
Пример:
ДЕНЬГОДА(Дата) // Результат - 365
#День
ДЕНЬ(<Дата>) - возвращает значение дня даты
Возвращаемое значение: Число
Пример:
ДЕНЬ(Дата) // Результат - 1
#Неделя
НЕДЕЛЯ(<Дата>) - возвращает порядковый номер недели в году для указанной даты
Возвращаемое значение: Число
Пример:
НЕДЕЛЯ(Дата) // Результат - 53
#День недели
ДЕНЬНЕДЕЛИ(<Дата>) - возвращает порядковый номер дня недели для указанной даты
Возвращаемое значение: Число
Пример:
ДЕНЬНЕДЕЛИ(Дата) // Результат - 5
#Час
ЧАС(<Дата>) - возвращает значение часа даты
Возвращаемое значение: Число
Пример:
ЧАС(Дата) // Результат - 23
#Минута
МИНУТА(<Дата>) - возвращает значение минуты даты
Возвращаемое значение: Число
Пример:
МИНУТА(Дата) // Результат - 59
#Секунда
СЕКУНДА(<Дата>) - возвращает значение секунды даты
Возвращаемое значение: Число
Пример:
СЕКУНДА(Дата) // Результат - 0
#Другие функции работы с датами
Также существуют и другие функции для работы с датами:
#ДатаВремя
ДАТАВРЕМЯ(<Год>, <Месяц>, <День>, <Час>, <Минута>, <Секунда>) - Возвращает значение типа ДатаВремя, по указанным параметрам. Обязательными являются только параметры Год, Месяц, День, если не заполнить остальные то они заполнятся нулями.
Возвращаемое значение: ДатаВремя
Пример:
ДАТАВРЕМЯ(2021, 12, 31) // Результат 31.12.2021 00:00:00
#НачалоПериода
НАЧАЛОПЕРИОДА(<Дата>,<Период>) - возвращает для указанной даты начало периода в который она входит
Возвращаемое значение: ДатаВремя
Параметр <Период> может принимать следующие значения: ГОД, ПОЛУГОДИЕ, ДЕКАДА, КВАРТАЛ, МЕСЯЦ, ДЕНЬ, НЕДЕЛЯ, ЧАС, МИНУТА.
Пример, указав в качестве периода "Месяц", получаем начало месяца:
НАЧАЛОПЕРИОДА(Дата, Месяц) // Результат 01.12.2021 00:00:00
#КонецПериода
КОНЕЦПЕРИОДА(<Дата>, <Период>) - возвращает для указанной даты конец периода в который она входит
Возвращаемое значение: ДатаВремя
Параметр <Период> может принимать следующие значения: ГОД, ПОЛУГОДИЕ, ДЕКАДА, КВАРТАЛ, МЕСЯЦ, ДЕНЬ, НЕДЕЛЯ, ЧАС, МИНУТА.
Пример, для периода "День" получаем конец дня:
КОНЕЦПЕРИОДА(Дата, День) // Результат 31.12.2021 23:59:59
#ДобавитьКДате
ДОБАВИТЬКДАТЕ(<Дата>, <Тип>, <Количество>) - добавляет к дате указанное количество временных интервалов
Параметр <Тип> в функции может принимать значения: ГОД, КВАРТАЛ, ДЕКАДА, ПОЛУГОДИЕ, МЕСЯЦ, ДЕНЬ, ЧАС, МИНУТА, СЕКУНДА
Возвращаемое значение: ДатаВремя
Пример, в качестве временного интервала указан "День", и количество 1:
ДОБАВИТЬКДАТЕ(Дата, День, 1) // Результат 01.01.2022 23:59:00
#РазностьДат
РАЗНОСТЬДАТ(<ПерваяДата>, <ВтораяДата>, <Тип>) - рассчитывает календарную разницу между двумя датами, в виде количества единиц измерения переданных в параметр Период.
Параметр <Тип> в функции РАЗНОСТЬДАТ может принимать значения: ГОД, КВАРТАЛ, МЕСЯЦ, ДЕНЬ, ЧАС, МИНУТА, СЕКУНДА
Возвращаемое значение: Число
Пример, вычисляем разность в днях между датами:
Условимся, что Дата1 = 01.01.2022 23:59:00
РАЗНОСТЬДАТ(Дата, Дата1, День) // Результат - 1
ВЫБРАТЬ ПЕРВЫЕ 1
ПоступлениеТоваровУслуг.Дата КАК Дата,
НАЧАЛОПЕРИОДА(ПоступлениеТоваровУслуг.Дата, МЕСЯЦ) КАК НачалоМесяца,
ДЕНЬ(ПоступлениеТоваровУслуг.Дата) КАК ДеньИзДаты,
МЕСЯЦ(ПоступлениеТоваровУслуг.Дата) КАК МесяцИзДаты
ИЗ
Документ.ПоступлениеТоваровУслуг КАК ПоступлениеТоваровУслуг
Результатом будет:
таблица из одной строки, так как мы указали выражение ПЕРВЫЕ 1
Дата НачалоМесяца ДеньИзДаты МесяцИзДаты
13.05.2022 9:51:06 01.05.2022 0:00:00 13 5
https://groxin.ru/lessons/funktsii-dlja-raboty-s-datami-v-jazyke-zaprosov/
1987) HTTP-Запросы
HTTP-запрос, это сообщение отправленное между клиентом и сервером по протоколу HTTP.
Мы каждый день отправляем тысячи HTTP-запросов переходя по ссылкам в браузере, обновляя страницы сайтов и общаясь в мессенджерах. Основной этого является HTTP (HyperText Transfer Protocol, протокол передачи гипер-текста, подробнее в википедии), позволяющий нам передавать произвольные данные в виде текста по сети. На всякий случай отмечу, что для отправки сообщений и получения ответа нужно два приложения клиент и сервер.
Зафиксируем для себя:
Клиент HTTP - приложение отправляющее запрос.
Сервер HTTP- приложение принимающее запрос и возвращающее на него ответ.
Общая схема действий выглядит так:
1. Клиент отправляет запрос
2. Клиент переходит в режим ожидания ответа
3. Сервер получает запрос
4. Сервер обрабатывает запрос
5. Сервер отправляет ответ обратно
6. Клиент принимает ответ
7. Обмен завершен
К счастью, в большинстве случаев у нас нет нужды глубоко погружаться в детали работы сетевых протоколов так как в большинстве языков программирования уже есть встроенный HTTP-клиент, который можно просто использовать не вдаваясь в суть вещей.
С помощью таких встроенных клиентов мы работаем с HTTP-протоколом не задумываясь о том, как это устроено.
Пример на псевдокоде:
АдресСервера = "academy.dev-ins.ru"
Ресурс = "integration/public_api/employees/"
Соединение = СоздатьСоединениеHTTP(АдресСервера)
Запрос = СоздатьHTTPЗапрос(Ресурс)
Ответ = Соединение.ПолучитьССервера(Запрос )
В этом примере мы видим что мы работаем с какими-то простыми сущностями и объектами языка для получения необходимого результата
#Погружение на глубину
А если смотреть вглубь, то нас встретит описание формата общения по HTTP-протоколу.
Посмотрим как выглядит HTTP-запрос для получения главной страницы нашего сайта
GET / HTTP/1.1
User-Agent: PostmanRuntime/7.29.2
Accept: */*
Cache-Control: no-cache
Host: academy.dev-ins.ru
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Именно такой текст отправляется в TCP-порт. Если не сильно вдаваться в суть, TCP - это нижележащая технология, протокол (Transmission Control Protocol, подробнее на википедии), обеспечивающий работу HTTP - протокола.
Как вы видите, наше сообщение это действительно текст, который распознается как HTTP - запрос, благодаря тому что оформлен в специальном виде.
Это сообщение можно разделить условно на две части:
Стартовая строка - GET / HTTP/1.1 - содержит метод HTTP / Протокол / Версию протокола
Заголовки запроса - все остальные строки из этого сообщения в формате Ключ: Значение
Заголовки бывают предопределенные, описанные в стандарте RFC, и произвольные, которые мы можем придумать и использовать самостоятельно.
В сообщении присутствует слово GET, это один из возможных методов (глаголов) HTTP. Указывает на то, что мы хотим получить какую-то информацию с сервера. Так же существуют и другие HTTP-методы (POST, DELETE, PATCH, PUT и т.д.).
После слова GET идет слеш (косая черта), оно указывает на конкретный ресурс к которому мы обращаемся. В данном случае косая черта означает что мы обращаемся к корневому ресурсу.
#Ресурсы
Ресурсами называются любые файлы, страницы или обработчики запросов на сервере, к которым можно обратиться из вне. Это исходит из определения аббревиатуры URL (Uniform Resource Locator, Унифицированный указатель ресурса).
Зафиксируем, URL - это указатель на ресурс.
В URL может быть более одной косой черты, например адрес страницы с уроками https://academy.dev-ins.ru/lessons/, стартовая строка запроса к этому URL выглядел бы так
GET /lessons/ HTTP/1.1
как видите, добавилось название ресурса lessons, к которому мы обращаемся и еще одна косая черта.
#Параметры URL
Все символы, которые находятся между двумя косыми чертами называются сегментами или параметрами URL, /параметр1/параметр2/.../параметрN
#Параметры запроса
Также можно передавать и вспомогательные данные в URL. Для этого необходимо добавить символ вопроса (?) в конец URL и перечислить параметры и их значения разделяя пары ключ - значение символом амперсанд (&). Например, так:
https://academy.dev-ins.ru/lessons?param1=1¶m2=2¶m3=test
Это очень удобно, когда нам нужно передавать какие-то конкретизированные, именованные значения в запросе.
#Тело запроса
В URL запроса можно передать далеко не все данные необходимые для работы HTTP-запросов. Чаще всего длина URL имеет ограничения. И если для получения данные с помощью метода GET, этого достаточно, то для метода POST(создание данных на сервер) или PATCH/PUT(обновление данных на сервере) нам уже необходимо какое-то более емкое хранилище. Для этого используется тело запроса (body). Как мог бы выглядеть запрос на добавление
POST /integration/public_api/employees/ HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.29.2
Accept: */*
Cache-Control: no-cache
Host: academy.dev-ins.ru
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Length: 140
{
"first_name": "Иван",
"last_name": "Иванов",
"middle_name": "Иванович",
"email": "ivanov@mail.ru"
}
Как видим, мы отправили POST-запрос, на создание новой записи на сервере, и добавилось несколько важных заголовков:
Content-Type: applcation/json - определяющий формат данных содержащихся в теле
Content-Length: 140 - определяющий размер данных, передающихся в сообщении, в байтах
после заголовков добавляется пустая строка, и дальше идет тело запроса в текстовом виде.
И если Content-Type является по большей части вспомогательным заголовком, от которого зависит только сможет ли какой-то универсальный обработчик автоматически определить тип содержимого или нет, то Content-Length в некоторых случаях может быть критически важен, ведь клиент и сервер должны как-то понять, что они загрузили сообщение полностью и когда количество полученных данных совпадает со значением указанным в заголовке, то передача прекращается.
https://groxin.ru/lessons/http-zaprosy/
2087) Ngrok
Ngrok — это приложение и сервис, с помощью которого можно открыть доступ к внутренним ресурсам компьютера, на котором он запущен, из внешней сети. Ngrok помогает создать публичный адрес и тоннель между публичным адресом и компьютером. С помощью которых пересылает все поступающие запросы из внешней сети на целевой компьютер.
Зачем это нужно?
Большинство из нас пользуется обычным домашним интернетом, и не имеет статического IP-адреса. Наш IP-адрес временно выдается нам нашим провайдером интернета, и с определенной переодичностью меняется. Что не позволит нам стабильно работать с нашим ресурсом, придется постоянно проверять не поменялся ли наш IP-адрес. Это очень неудобно. Для того, чтобы проверить это в можете перейти на сайт 2ip, запомнить текущее значение IP-адреса, и обновить страницу спустя некоторое время. Ngrok же берет на себя формирование стабильного соединения и предоставляет нам виртуальный адрес, по которому мы можем получить доступ к нашему компьютеру извне.
Как использовать?
Перейдите на сайт ngrok в раздел загрузок выберите вашу операционную систему и скачайте файлы
После скачивания необходимо распаковать загруженный архив, и вызвать исполняемый файл из консоли.
Я распаковываю архив в корень диска C, чтобы было проще к нему обращаться
Очень желательно зарегистрироваться на платформе ngrok, чтобы получить более долго живущие соединения, иначе сессия будет обрываться достаточно часто.
После регистрации в личном кабинете ngrok нам станет доступен токен авторизации, который нам необходимо будет добавить в конфигурацию ngrok.
Переходим в раздел Токенов
Нажимаем на добавление токена
Сохраняем новый токен
После сохранения появится окно с токеном, можно его скопировать и закрыть окно
После получения токена мы должны перейти в консоль на нашем компьютере и выполнить команду, как написано в инструкции при скачивании
Для этого открываем командную строку, если у вас Windows, то через Пуск и в поле поиска вводим CMD
Если у вас Mac OS или Linux, то открываем Terminal
Переходим в папку где мы развернули наш архив с Ngrok. В моем случае эта команда выглядит так.
cd C:\ngrok-v3-stable-windows-amd64
И выполняем команду, которая была указана в инструкции по установке, где заменяем слово
ngrok config add-authtoken
В результате мы получили сообщение о том, что наш токен сохранен и всё в порядке. Это значит, что в дальнейшем приложение Ngrok будет авторизовываться на сервере с помощью этого токена и позволять на делать немного больше, чем неавторизованный пользователь.
Теперь запустим наш Ngrok. для этого необходимо выполнить команду
ngrok http 80
тем самым мы указываем приложению, что хотим открыть тоннель с помощью протокола http на порту номер 80. Порт 80 большинством приложений используется по умолчанию, как порт для связи через протокол http. При желании можно указать любой не занятый, но не забывать при этом перенастроить сервер.
Получили следующий результат работы приложения.
Это значит, что тоннель открыт, и в поле Forwarding указан адрес, по которому наш компьютер доступен извне. Так же там указано что этот адрес указывает на внутренний адрес http://localhost:80. И если ваше приложение доступно на вашем компьютере по адресу localhost:80, то значит оно будет доступно и извне по сгенерированному ngrok адресу.
Для того, чтобы закрыть тоннель можно нажать Ctrl + C внутри командной строки, или закрыв приложение.
Всё, работа сделана, теперь можно пользоваться. Испытания в нашей академии используют методы автоматического тестирования ваших приложений, которые находятся на вашем компьютере. А Ngrok позволяет получить к ним доступ с нашего сервера.
https://groxin.ru/lessons/ngrok/
2145) Swagger
Swagger - это инструмент для описания, и тестирования HTTP API (Что это?). Ознакомиться с продуктом подробнее можно на официальном сайте. Изначально разрабатывался для работы с протоколом SOAP (Что это? википедия), но потом стал использоваться и для работы с любым HTTP API. Наше публичное API использует Swagger и спецификацию Open API для описания возможностей взаимодействия, что очень удобно.
Если говорит простыми словами, то с помощью Swagger мы можем описать как работает наше API не просто текстом, а красиво структурировать, предоставить примеры использования, с возможностью интерактивной работы с ними. Прямо в интерфейсе получившейся документации можно понажимать на кнопки и посмотреть результат работы того или иного метода, с полным описанием формата взаимодействия.
Зачем это нужно?
К сожалению большинство HTTP API так устроено, что снаружи совершенно невозможно понять есть оно вообще и работает ли оно, если нет документации. Формат передаваемых данных и сами данные разработчик API волен обратабывать так как ему заблагорассудится. И для того чтобы разобраться, в самых запущенных случаях, приходится прибегать к реверс-инжинирингу. Когда мы находим какую-то часть приложения или другое приложение которая уже работает с этим API и пытаемся понять как оно это делает. Очень сильно в этом деле помогает наличие исходных кодов.
Я буду счастлив если вы никогда в своей жизни не столкнётесь с плохо документированным API. Иногда документации на API вообще нет, или она была написана при разработке сервиса, и не обновлялась с момента создания. В таком случае мы можем получить ситуацию, когда перед нами приложение с которым можно взаимодействовать, но непонятно как. Или в документации написано как, но в действительности оно работает иначе.
Swagger помогает решить эту проблему, во первых тем, что многие фреймворки поддерживают работу с ним из коробки, и могут сгенерировать swagger-документацию автоматически. Так и в целом тем, что устроен достаточно удобно и позволяет сформировать действительно красивую и удобную документацию без особых трудозатрат.
Да и в целом стоит научиться работать с таким вариантом документации, хотя бы потому, что он является в своем роде стандартом, и многие публичные сервисы предоставляют интеграционную документацию в формате Open API (Swagger).
Яркий пример такой документации можно увидеть и на сайте самого Swagger. Перейдя по ссылке.
Мы видим что документация удобна тем, что позволяет заполнить значения параметров, нажать на кнопку "Try it out" и посмотреть в каком формате целевому приложению будет передан запрос и какой будет получен ответ.
https://groxin.ru/lessons/swagger/
2163) Отправка HTTP-запросов из 1C
Платформа 1С предоставляет встроенный HTTP-Клиент, с помощью которого можно отправлять HTTP-запросы без особых ограничений.
Начнем сразу с примера, будем сразу учиться писать код с учетом некоторых особенностей, но не слишком усложняя:
Сервер = "academy.dev-ins.ru";
ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL;
Попытка
Соединение = Новый HTTPСоединение(Сервер,,,,,,ЗащищенноеСоединение);
Исключение
Сообщить("Подключение не удалось, по причине :" + ОписаниеОшибки());
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
Сначала мы объявляем и сразу инициализируем переменные Сервер со значением подходящим для нашего сервера, и ЗащищенноеСоединение инициализированное пустым конструктором. Обе из них нужны для создания HTTP - соединения, которое происходит дальше.
Сервер мы передаем в соединение, для того чтобы определить "куда" мы подключаемся, а защищенное соединение, чтобы определить "как" мы подключаемся. В данном случае соединение произойдет по протоколу HTTPS, а если не указать защищенное соединение, то по протоколу HTTP. Это важный момент, наш сервис работает именно по протоколу HTTPS, и если не указать защищенное соединение, то сервис постарается перенаправить нас на сервис по правильному протоколу, сделать Redirect, обработку которого мы в нашем коде не описали, чтобы не усложнять.
Весь код соединения мы заключили в попытку, потому что в случае неудачи конструктор HTTPСоединение выбросит исключение, которое мы обязаны обработать.
Далее мы сформируем правильный URL в переменной РесурсСПараметрами, и добавим в него параметры запроса после знака вопроса. Для простоты укажем их просто в строке. В более сложных ситуациях параметры лучше добавлять не используя жесткое их задание в строке.
Ресурс = "tasks/integration_1c/0c59f818-5c03-4a2e-b925-f496736e24d5/21c2a22c431611ed80120242ac1c0005";
РесурсСПараметрами = Ресурс + "?" + "fullname=Имя Пользователя";
Запрос = Новый HTTPЗапрос(РесурсСПараметрами);
Ответ = Соединение.Получить(Запрос);
КодСостояния = Ответ.КодСостояния;
ТелоВВидеСтроки = Ответ.ПолучитьТелоКакСтроку();
Далее мы создали объект HTTPЗапрос и передали в него наш РесурсСПараметрами, После чего вызвали метод Получить у объекта соединения и передали в него наш запрос, выполнив тем самым GET-запрос. В результате, после выполнения запроса мы получим результат выполнения в переменную Ответ. Там будет сформирован объект HTTPОтвет, содержащий все необходимые данные:
КодСостояния - Это HTTP статус-код (200, 300, 404, 500 и т.д.) сообщающий о состоянии ответа.
Заголовки - Содержащие заголовки ответа сервера
Тело - Для получения которого есть несколько методов, тело можно получить в файл, в строку, в двоичные данные и в поток. В данном случае мы получили его как строку. Которую в дальнейшем уже можно обработать внутри 1С
https://groxin.ru/lessons/otpravka-http-zaprosov-iz-1c/
2197) Программный интерфейс приложения (HTTP)
Программный интерфейс приложения или Application programming interface (API), это описание возможностей по внешнему управлению каким либо приложением. Вариантов реализации API для приложений множество, но мы будем рассматривать именно HTTP API.
HTTP API - это реализация интерфейса взаимодействия с приложение с помощью протокола HTTP. Проще говоря это набор функций или объектов, которые могут быть вызваны извне целевого приложения из другого приложения или например браузера, чаще всего внутри локальной сети или через интернет.
Большинство сайтов и веб-приложений в интернете используют HTTP API в своей работе. По сути для работы с большинством веб-приложений нужно два приложения - браузер и серверное приложение. Архитектура веб-приложений на деле сильно сложнее, но в данном случае такое упрощение сделано намерено.
Приложение расположенное на сервере предоставляет HTTP API используя который браузер отображает содержимое сайта. Браузер не знает ничего про внутреннее устройство приложения расположенного на сервере, и какие внутренние механизмы оно использует, но может отображать результат его работы, чаще всего это какие-то html страницы, но бывает и так что веб-приложения с помощью HTTP API выполняют и более сложные расчеты.
Например часто можно встретить HTTP адрес такого формата. Можно вставить его в строку браузера и увидеть результат.
https://groxin.ru/integration/public_api/employee_posts/
В данном случае браузер обратится по этому адресу (конечной точке, endpoint) и приложение расположенное на сервере выдаст в результате какие-то данные.
Это яркий пример, когда мы осуществили простейшую интеграцию и получили в одном приложении, в браузере, данные из другого приложения.
Точно так же мы можем выполнить тот же самый запрос, но с использованием программирования.
Например в синтаксисе 1С:
БезопасноеСоединение = Новый ЗащищенноеСоединениеOpenSSL();
СоединениеСGroxin = Новый HTTPСоединение("groxin.ru",,,,,,БезопасноеСоединение);
HTTPЗапрос = Новый HTTPЗапрос("/integration/public_api/employee_posts/");
HTTPОтвет = СоединениеСGroxin.Получить(HTTPЗапрос);
Результат = HTTPОтвет.ПолучитьТелоКакСтроку();
Переменная Результат, при удачном выполнении кода будет равна:
[
{
"id": 15,
"date_from": "2022-10-03",
"date_to": "2023-10-03",
"employee": {
"id": 15,
"created": "2022-10-03T15:15:51.070761+03:00",
"updated": "2022-10-03T15:15:51.070766+03:00",
"first_name": "Марк",
"last_name": "Львов",
"middle_name": "Андреевич",
"email": "m.lva@academy.ru"
},
"post": {
"id": 7,
"name": "Маркетолог"
}
}
...
}
]
Серверное приложение же в этом случае должно иметь в своей функциональности возможность публикации таких ресурсов API. В 1С такое реализуется через связку HTTP/Web - сервисов и веб-сервера Apache или IIS. В приложениях на других стеках процедура похожа, но может иметь ряд значительных отличий, по сложности и оформлению.
Так же реализация HTTP API опирается на возможности протокола HTTP, который предоставляет удобные инструменты для отправки и получения сообщений.
https://groxin.ru/lessons/programmnyj-interfejs-prilozhenija-http/
2260) Для чего предназначена команда ЕСЛИ
Иногда для выполнения программы нужно сделать так, чтобы компьютер выполнял
оператор "Если" служит для того, чтобы компьютер выполнял некоторые действия только при определенном условии.
Условный оператор "Если" - один из основных элементов программирования, который позволяет принимать решения на основе определенных условий.
Используя операторы "Если - ИначеЕсли - Иначе",
Вы можете создавать разветвленные логические конструкции в Вашем коде для обработки различных сценариев работы программы.
Глупо отрицать: каждый программист должен отлично разбираться в структурах данных.
эффективная реализация приложения позволяет ему работать беспроблемно даже в условиях большой нагрузки.
Именно благодаря презумпции “есть кто-то умнее меня” я развиваюсь дальше.
Упорная работа ценнее, чем талант...
https://leetcode.com/
Я решил 500 задач на LeetCode
В российской экономике сейчас работают два фактора. С одной стороны деньги, которые раньше шли в стабилизационные фонды сейчас льются прямо в экономику. С другой стороны растущий ВПК безвозвратно высасывает деньги и кадры.
Если второй фактор перевесит первый, то просто по закону сохранения энергии пойдет стагфляция.
IT-индустрия переживает аналогичный этап, когда значительный прирост эффективности, вносимый IT в другие сферы, выходит на плато, а это означает значительное снижение денег в индустрии в целом, как это когда‑то было с паровозами, металлургией, потом со станками...
Почему возникает ошибка "Преобразование значения к типу Число не может быть выполнено"?
https://helpme1s.ru/pochemu-voznikaet-oshibka-preobrazovanie-znacheniya-k-tipu-chislo-ne-mozhet-byt-vypolneno
2292) граница массива
ВГраница()
2295) соединение строк административный с послед отработкой
СтрСоединить
СтрРазделить
СтрРазделить
2301) Функция формирует массив из подстрок, которые образуются путем разделения исходной строки символами-разделителями.
https://www.about1c.ru/v83/new-features/new-string-functions
Функция СтрРазделить() имеет следующий синтаксис:
Массив СтрРазделить(ИсходнаяСтрока, Разделители, [ВключатьПустые])
"ИсходнаяСтрока Строка Разделяемая строка"
"Разделители Строка Строка символов, каждый из которых является индивидуальным разделителем."
"ВключатьПустые Булево Указывает необходимость включать в результат пустые строки, которые могут образоваться в результате разделения исходной строки. Значение по умолчанию: Истина"
//используем один разделитель:
мРезультат = СтрРазделить("Один,Два,Три,", ",");
//мРезультат: {"Один","Два","Три",}
//используем несколько разделителей:
мРезультат = СтрРазделить("8(999)999-99-99", "()-");
//мРезультат: {8,999,999,99,99}
https://www.about1c.ru/v83/language-reference/string-functions/str-split
2322) Как свернуть массив 1с в строку?
ВыходнаяСтрока = СтрСоединить(м, Разделитель);
https://www.about1c.ru/v83/language-reference/tutorial/array-examples/how-shrink-array-to-string
https://www.about1c.ru/v83/category/language-reference/tutorial/page/5
2326) Как отсортировать массив в 1с?
если заранее известно, что потребуется сортировка некоторых элементов данных, можно сразу использовать более подходящую коллекцию — список значений
https://www.about1c.ru/v83/language-reference/tutorial/array-examples/how-sorting-array
2329) Как загрузить массив в список значений?
//создаем и наполняем массив
м = Новый Массив;
...
//создаем список значений
сз = Новый СписокЗначений;
//загружаем элементы массива в список значений
сз.ЗагрузитьЗначения(м);
https://www.about1c.ru/v83/language-reference/tutorial/array-examples/how-load-array-to-value-list
2340) Как скопировать массив в 1с?
2343) Операторы объявления
Перем — объявляет переменную внутри модуля, процедуры или функции
Новый — оператор создания нового объекта указанного типа
2347) Условные операторы
Если … Тогда
Если … Тогда … ИначеЕсли
Тернарный оператор ?(.., .., ..)
2353) Операторы цикла
Для … Цикл … КонецЦикла
Для каждого … Цикл … КонецЦикла
Пока … Цикл … КонецЦикла
2359) Безусловные операторы
Возврат — выполняет преднамеренный выход из процедуры или функции
Прервать — выполняет преднамеренное прерываение ближайшего цикла
Продолжить — выполняет преждевременное продолжение текущего цикла (переход в начало)
Перейти — выполняет безусловных переход к указанной метке
2365) Операторы обработки исключений
Попытка … Исключение … КонецПопытки
ВызватьИсключение
2369) Функциональные операторы
Процедура … КонецПроцедуры
Функция … КонецФункции
Выполнить — оператор выполнения произвольного участка кода
2375) Прочие операторы
ДобавитьОбработчик
УдалитьОбработчик
2381) Обработка ошибок на встроенном языке 1С 8.1, 8.2 и 8.3
Ошибка — это восстановимая ошибка пользовательского уровня. Такие ошибки всегда можно исправить и продолжить работу. Например, ошибка может возникать при проверке заполнения обязательных реквизитов в форме объекта, если один из них не заполнен. Такую ошибку можно устранить, просто указав значение в нужном поле ввода.
Исключительная ситуация — это ошибка уровня конфигурации или платформы. Как правило, ошибка уровня конфигурации прерывает процесс работы с возможностью восстановления, а ошибки уровня платформы почти всегда приводят к принудительному завершению работы программы, т.е. они «лечатся» только перезапуском программы.
Основной алгоритм обработки ошибок, внедренный в технологическую платформу 1С:Предприятие еще с версии 8.1, можно представить в виде схемы:
https://www.about1c.ru/v83/wp-content/uploads/sites/5/2023/10/p154.png
Он просуществовал до версии 8.3.16 включительно. Начиная с версии 1С:Предприятие 8.3.17 алгоритм обработки ошибок претерпел существенные изменения.
Можно увидеть, что основной точкой входа в обработку ошибок для разработчика является «попытка» — специальный оператор встроенного Попытка ... Исключение. Просто помещаете ваш плохой код в этот оператор, и он отлавливает для Вас ошибки, например, так:
Попытка
ПроверяемыйПараметр = Неопределено;
Если ПроверяемыйПараметр Тогда
//код, который не будет выполнен
КонецЕсли;
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Однако, не следует каждую ветку кода включать в попытку «на всякий случай». Это снижает удобство чтения кода и увеличивает трудозатраты на его отладку.
Немалую роль на количество ошибок оказывает качество написания кода. Например, в предыдущем примере вполне можно было бы обойтись без попытки, если явно указать сравниваемые значения:
ПроверяемыйПараметр = Неопределено;
Если ПроверяемыйПараметр = Истина Тогда
//код, который не будет выполнен
КонецЕсли;
В случае, если 1С запущена в режиме отладки (например, клавишей F5 из конфигуратора), программа будет считать пользователя опытным и выдавать сообщения об ошибках с возможностью их расшифровки:
В остальных случаях пользователь увидит только краткую информацию об ошибке и вряд ли сможет внятно объяснить службе поддержки, что не работает и в каком контексте:
https://www.about1c.ru/v83/language-reference/error-processing