Работа со схемой запроса

Публикация № 811832

Разработка - Инструментарий разработчика

Схема запроса Объектная модель Конструктор запросов Конвертация Консоль

Стандартом взаимодействия с реляционной базой данных стал язык SQL. Приемником SQL в 1С является язык запросов. Язык запросов, также как и SQL, является структурированным. Составляющие структуры запроса отвечают на разные вопросы о том, какие данные требуется получить и какие манипуляции с множествами данных необходимо произвести при получении. В простых случаях текст запроса можно написать вручную, однако в сложных случаях, а также при программном формировании, - лучше воспользоваться объектной моделью запроса и использовать объект "Схема запроса". В статье дается описание объектной модели и особенностей работы с ней, а также приводится решение, упрощающее взаимодействие с объектом "Схема запроса".

Оглавление

Введение. 1

Объектная модель запроса. 1

Структура модели. 1

Источники. 1

Соединения. 1

Поля. 1

Отбор. 1

Группировка. 1

Порядок. 1

Колонки. 1

Итоги. 1

Получение текста запроса. 1

Особенности. 1

Подсистема Работа со схемой запроса. 1

Введение. 1

Построение структуры запроса. API 1

Порядок работы.. 1

Резюме. 1

Практика использования. 1

Шаблон «Выборка из временной таблицы». 1

Шаблон «Построение текста запроса по параметрам отбора». 1

Шаблон «Последовательность преобразований источника»

Шаблон "Ханойская башня"

Шаблон «Расширение данных источника»

. 1Шаблон "Работа с характеристиками"

Примеры.. 1

Объединение. 1

Группировка. 1

Вложенный запрос. 1

Приложения. 1

Обработка «Конструктор схемы запроса». 1

Поставка. 1

Источники


. 1

Введение

До версии платформы 8.3.5 не существовало такого объекта как "Схема запроса". В задачах, где требовалось построить текст запроса динамическим образом, текст запроса собирался из фрагментов текстовых блоков. Встречались и такие варианты, когда динамический текст запроса мог моделироваться с помощью параметров. Последний вариант, пожалуй, наихудший способ получения текста запроса, так как в этом случае вероятнее всего страдала производительность при его выполнении. 

Код построения запроса из текстовых фрагментов мог быть весьма запутанным. Такой код в большей степени не содержал собственно логики построения запроса, а отражал логику работы с текстом. В целом это отрицательно сказывалось на отладке, сопровождении и развитии такого кода.

Объектная модель запроса, реализованная в платформе начиная с версии 8.3.5, позволила при решении задачи получения динамического текста запроса использовать код, который уже отражал бы не манипуляции с текстом, а логику структурного построения запроса. Кроме того, в объектной модели нет смысла в манипуляции с параметрами запроса для динамического изменения логики работы запроса. Таким образом программное формирование текста запроса с использованием объектной модели позволяет получить код, подчиненный логике запроса и делает ненужным манипуляции с параметрами. Первое способствует упрощению отладки, уменьшению затрат на сопровождение и развитие программного кода, а второе - лучшей производительности выполнения запроса.

Объектная модель запроса

Описание объектной модели схемы запроса можно найти во встроенной справке конфигуратора. Основные принципы, заложенные в модель и базовые алгоритмы работы с ней, а также подводные камни - я попытаюсь описать ниже.     

Рисунок 1. Объектная структура запроса

Объект верхнего уровня модели - это пакет запросов. Создание модели начинается с добавления запроса в пакет.

Запрос может быть:

  • на выборку данных
  • на создание временной таблицы из параметра
  • на уничтожение временной таблицы

В свойствах запроса можно указать: Разрешенные, Автоупорядочивание, Имя таблицы для помещения. Также на уровне запроса можно задать порядок выборки данных, а также настроить итоги.

Запрос состоит из операторов Выбрать. Основные составляющие оператора: источники, связи источников и поля данных. В качестве источника можно указать физическую, виртуальную, временную таблицу, параметр или вложенный запрос. В операторе Выбрать можно настроить ограничение на количество строк результата выборки и дополнительно указать признак "Выбрать различные". Результат выборки определяется условиями связей и отборов. Несколько операторов Выбрать могут быть объединены в рамках одного запроса по условию, допускающему дублирования данных (действует по-умолчанию) - "Объединить" или по условию исключающему дублирование - "Объединить Все".

Рисунок 2. Источники оператора Выбрать

Данные выборки определяются Источниками. Самой простой тип Источника - это физическая таблица, для него не требуется указывать параметры.

Для виртуальной таблицы доступны параметры, по которым будет построена таблица при выполнении запроса. Список параметров для каждого вида виртуальной таблицы можно уточнить во встроенной справке (Работа с запросом -> Таблицы). В модели доступ к параметрам осуществляется по индексу.

В случае, когда необходимо описать в качестве Источника временную таблицу, которая будет создана из прикладного объекта или получена из менеджера временных таблиц, нужно указать имя параметра запроса или имя временной таблицы из менеджера временных таблиц.

Для получения связанных отношениями данных мало указать только Источники, необходимо также указать их связи или в терминах объектной модели - Соединения. По сути Соединения содержат информацию о связях двух Источников по некоторому условию.

Данные Источников оператора Выбрать определяют доступные для выбора поля. На уровне запроса поля операторов Выбрать группируются в колонках (см. описание Колонки).

Завершается описание оператора Выбрать указанием условий отбора.

При использовании агрегатных функций в выражениях полей выборки все поля, не содержащие агрегатную функцию, попадают в поля группировки.

Сортировка или в терминах модели - Порядок, определяется перечнем полей и направлений сортировки. Определяется порядок на уровне колонок запроса.

Колонки запроса определят поля выборки. При объединении нескольких операторов Выбрать одной колонке будет соответствовать несколько полей (по одному от каждого оператора Выбрать).

В отличии от полей оператора в колонках запроса можно задать тип и порядок.

Таблица 1. Соотнесение колонок запроса и полей операторов Выбрать

Индекс

Колонка запроса

Поле оператора 1

...

Поле оператора N

0

Псевдоним 1

Путь к данным 1

...

Путь к данным 1

1

Псевдоним 2

Путь к данным 2

...

Путь к данным 2

...

...

...

...

...

N

Псевдоним N

Путь к данным N

...

Путь к данным N

На уровне Запроса, помимо группировки в операторах Выбрать, можно также описать получение итогов. Итоги описываются перечнем полей группировки и выражений итогов. Поля группировки в терминологии модели - Контрольные точки итогов помимо названия поля содержат также дополнительные параметры: Начало периода дополнения, Конец периода дополнения, Тип дополнения периодами, Тип контрольной точки. Также в Запросе можно указать признак Общие итоги.

Текст запроса можно получить как для всего пакета запросов, так и для отдельного запроса из пакета.

Работая с объектом "Схема запроса" необходимо понимать одну важную особенность поведения этого объекта. Дело в том, что "Схема запроса" работает на программном уровне также, как и в конструкторе запроса в интерактивном режиме. Так, Вы можете заметить, что добавляя таблицы, конструктор также может добавлять и связи, если находит подходящие для этого поля совпадающего типа в обоих источниках. Такое же поведение на программном уровне вызывает недоумение (по крайней мере у меня), так я, как программист, не ожидаю, что при добавлении источника у меня вдруг появятся еще и связи к нему. Хотя с другой стороны, при удалении временной таблицы или поля, вполне логично, что все ссылки на эту таблицу как на источник или на удаленные поля будут очищены, а связи по ним удалены. При использовании агрегатных функций в полях выборки автоматически добавляются и поля группировки.

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

  • Запрос пакета 0
    • Оператор Выбрать
      • Источники
      • Соединения, Поля
      • Отбор
    • Оператор Выбрать ...
    • Колонки, порядок, итоги
  • Запрос пакета 1 ...

Подсистема Работа со схемой запроса

Работа напрямую с объектом "Схема запроса" обладает рядом недостатков:

  • на простые действия требуется много кода. Для описания поля требуется три строки кода: добавить выбираемые поля, установить поле колонки, установить псевдоним колонки.
  • элементы интерактивного поведения приводят к неоднозначности кода. При добавлении источника могут возникать одно или несколько соединений, причем как с добавленным источником, так и с существовавшим ранее.
  • некоторые объекты возникают и существуют по умолчанию, что приводит к необходимости писать разный код в зависимости от того первый это элемент или последующий. Первый запрос пакета существует по умолчанию, аналогично и для оператора - их нельзя никак удалить.
  • поддерживаются только простые операции по построению модели, что не позволяет писать более компактный код с использованием повторяющихся структур (см. сервисные функции подсистемы)

Предлагаемая подсистема позволяет нивелировать недостатки работы объекта схемы запроса. Функции подсистемы позволяют за один вызов добавить и настроить объект подсистемы. Для достижения однозначности работы результат «интерактивных» действий объекта очищается. Объекты, которые нельзя удалить, переиспользуются при последующем вызове функции добавления. Также в подсистему добавлены сервисные функции поддержки построения запроса.

Построение структуры запроса. API

Более подробное описание API подсистемы находится в самом модуле. К функциям модуля есть комментарии в формате стандартов 1С (Описание процедур и функций), дающие полное представление об их работе: общее описание, описание параметров, примеры. Это описание доступно в контекстной подсказке при наборе кода.

Таблица 2. API

Функции

Краткое описание

Работа с запросом

 

ДобавитьЗапросПакета

Добавляет запрос выбора, создания временной таблицы, на уничтожение временной таблицы

ДобавитьЗапросПакетаИзТаблицы

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

УстановитьИндексЗапросаПакета

Позволяет изменить индекс добавленного запроса

ДобавитьПорядок

Установка порядка по колонке запроса

Работа с оператором

 

ДобавитьОператор

Добавляет оператор Выбрать

ДобавитьКопиюОператора

Добавляет в запрос копию оператора выбрать. Функция может быть использована для добавления однотипных операторов, объединенных в одном запросе. После добавления оператора его можно индивидуально настроить (см. пример в описании функции, шаблон "Ханойская башня")

ДобавитьИсточник

Добавление в оператор Выбрать источника: физическая, виртуальная таблица, временная таблица (можно передать образец в виде таблицы значений), вложенный запрос

ЗаменитьИсточник Заменяет источник оператора выбрать с сохранением соединений и псевдонима (см. шаблон "Ханойская башня")

ДобавитьПоле

Добавляет поле источника в оператор выбрать и в колонку запроса пакета

УдалитьПоле

 

УстановитьВыражениеПоля

Позволяет переустановить выражение поля. Например, добавить использование агрегатной функции.

ДобавитьСоединение

 

ДобавитьУсловиеСоединения

Добавляет условие к существующим условиям соединения источников

ДобавитьУсловиеХарактеристики

Добавляет условий ограничений по значениям характеристик (свойств или категорий). Используется в шаблоне «Построение текста запроса по параметрам)

Сервисные

 

СоздатьЗапрос

Теперь нет необходимости создавать запрос отдельно. Функция вызывается на основании схемы запроса и возвращает запрос.

УстановитьПараметрыВиртуальнойТаблицы Позволяет установить у источника параметры в поименованном виде

СконвертироватьПараметрыОтбора

Конвертация параметров отбора схемы запроса СКД в целевую схему

Начать работать с подсистемой можно с перевода существующих алгоритмов, где используется получение или описание текстов запросов, или же при написании новых. В обоих случаях я рекомендую к использованию сервисную обработку конвертации текста запроса в код: «Конструктор схемы запроса».

Общий порядок работы может быть следующим:

  • выделить/получить целевой текст запроса
  • сконвертировать часть текста или весь текст запроса в код при помощи обработки «Конструктор схемы запроса»
  • выполнить алгоритмическую оптимизацию полученного кода, добавить комментарии
  • добавить установку текста запроса из результата построения схемы запроса (получить текст запроса можно из объекта схемы или из объекта запрос пакета) или использовать сервисную функцию создать запрос

В результате проделанной работы у вас будет код конструирования структуры с использованием объекта «Схема запроса». Такой код уже можно оптимизировать и комментировать, без опасения, что комментарий не сохранится при последующем редактировании.

Работать с текстом запроса можно как в виде текста, так и через объект «Схема запроса». Использование объектной модели запроса позволяет полностью сосредоточится на работе с запросом, а не с текстом. В простых случаях использование текстового запроса может быть более наглядным, однако для сложных запросов объектная модель более предпочтительна.

Работая непосредственно с объектом «Схема запроса» нужно учитывать его интерактивные свойства. Также, как и в интерактивном виде, конструктор запроса автоматически добавляет связи по полям одинакового типа данных, так и на программном уровне схема запроса автоматически добавляет в модель связи, а также содержит неудаляемые объекты: первый запрос и первый оператор выбора.

Интерактивные свойства объекта схема запроса на программном уровне приводят к неоднозначности работы алгоритмов. Наличие обязательных объектов коллекций, таких как запрос и оператор выбора делают невозможным использование одинаковых алгоритмов работы с их элементами.

Предложенное решение на базе использования подсистемы "Работа со схемой запроса" с одной стороны устраняет недостатки работы со встроенным объектом схема запроса, с другой - повышает наглядность текста алгоритма в коде.

Далее будут рассмотрены шаблоны решения типовых задач, а также примеры построения текста запроса из схемы.

В данном шаблоне решается задача получения данных таблицы значений. В тексте запроса нельзя напрямую работать с данными прикладных объектов, однако можно передавать значения параметров и работать уже с ними.

Значения параметров простых и ссылочных типов можно использовать сразу в запросе. Для работы с параметрами табличного типа необходимо вначале на их основании создать временную таблицу и в дальнейшем в качестве источника данных использовать её.

Таким образом, чтобы работать с данными табличного объекта при выполнении запроса необходимо сначала прочитать данные объекта во временную таблицу в первом запросе пакета, а в последующих запросах использовать эту таблицу в качестве источника данных.

При использовании подсистемы есть два решения:

  1. Создать запрос на создание временной таблицы
  2. Использовать описание временной таблицы из менеджера временных таблиц

Во 2-ом случае временная таблица уже должна быть описана ранее. Если имеет место разрыв в описании, то можно сослаться на описание временной таблицы из Менеджера временных таблиц. Для 1-го случая вместо менеджера указывается имя параметра со знаком &.

Текст модуля с источником из временной таблицы менеджера временных таблиц

//  Пусть есть некий запрос
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.Текст = "ВЫБРАТЬ
| 0 КАК Сумма
|ПОМЕСТИТЬ ВТ_ОБОРОТЫ";
Запрос.Выполнить();
//  Нужно создать схему запроса, где в качестве источника будет указана временная таблица из менеджера запроса
СхемаЗапроса    = Новый СхемаЗапроса;
ЗапросПакета    = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
//  Источник из временной таблицы менеджера временных таблиц
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, РаботаСоСхемойЗапроса.ПолучитьОписаниеВременнойТаблицы("ВТ_ОБОРОТЫ", Запрос.МенеджерВременныхТаблиц), "ВТ_ОБОРОТЫ");

Рисунок 3. Наложение ограничений на выбор данных основного источника через условия связей

Рассмотрим применение шаблона на примере создания текста запроса динамического списка. При открытии формы списка по переданным параметрам отбора платформа устанавливает фиксированные настройки. В параметрах можно передать только критерии отбора на равенство по полям запроса первого уровня (точки использовать нельзя). У этого способа настройки есть ограничение - нельзя передать сложные критерии отбора, когда требуется использовать не только условие равенства значений полей переданным значениям отбора, но и В списке, Не и т.д., или когда требуется использовать данные подзапросов и дополнительных таблиц, данные виртуальных таблиц с параметрами.

Обойти обозначенные ограничения можно, если при открытии формы списка проанализировать переданные параметры и по результату модифицировать текст запроса. После изменения необходимо также установить параметры динамического списка.

Теперь собственно о шаблоне. Согласно шаблону все параметры должны передаваться в структуре Отбор или Характеристики. Эти структуры содержат названия параметров и их значения. Алгоритм формирования текста запроса должен проанализировать параметры из структуры Отбор, выполнить модификацию запроса, удалить найденные параметры из структуры Отбор и добавить в структуру ПараметрыЗапроса. Далее значения структуры Отбор будут установлены платформой в фиксированных настройках отбора, а параметры из структуры ПараметрыЗапроса необходимо будет установить в параметрах динамического списка.

Алгоритм модификации запроса:

  1. Проверить наличие параметра или группы параметров в структуре Отбор
  2. При наличии выполнить модификацию запроса
  3. Удалить использованные параметры из Отбора и добавить в ПараметрыЗапроса

Текст модуля настройки динамического списка на основе переданных параметров 

СхемаЗапроса.УстановитьТекстЗапроса(Список.ТекстЗапроса);
Если Параметры.Свойство("Отбор") Тогда
  //  Переместить все параметры, которые не относятся к прямому отбору, в структуру ПараметрыЗапроса
  ОбщийКлиентСервер.ПереместитьЗначенияСвойств(Параметры.Отбор, ПараметрыЗапроса, "Организация,Контрагент,ДоговорКонтрагента");
  //  Проверить наличие одиночного параметра
  Если ПараметрыЗапроса.Свойство("ИмяПараметра") Тогда
    ...
  КонецЕсли;
  //  Проверить существование группы связанных параметров
  Если ОбщийКлиентСервер.СтруктураСодежитСвойства(ПараметрыЗапроса, "Организация,Контрагент,ДоговорКонтрагента") Тогда
    ДобавитьИсточник(...);
    ДобавитьСоединение(...);
  КонецЕсли;
  //  Проверить наличие структуры Характеристики
  Если Параметры.Свойство("Характеристики") Тогда
    //  Установить характеристики, используя сервисную функцию ДобавитьУсловиеХарактеристики
    Для ЭлементХарактеристики Из Параметры.Характеристики Цикл
      ИмяСвойства = ЭлементХарактеристики.Ключ;
      РаботаСоСхемойЗапроса.ДобавитьУсловиеХарактеристики(ОператорВыбрать, Источник, "РегистрСведений.ДополнительныеСвойства»" "", "", …);
      ПараметрыЗапроса.Вставить(ИмяСвойства, ПланВидовХарактеристик.Свойства["ИмяСвойства"]);
  КонецЕсли;
КонецЕсли;
//  Установка модифицированного текста запроса и установка параметров динамического списка
Список.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
Для каждого ЭлементПараметраЗапроса Из ПараметрыЗапроса Цикл
  Список.Параметры.УстановитьЗначениеПараметра();
КонецЦикла;

Шаблон «Последовательность преобразований источника»

Рисунок 4. Последовательность запросов преобразования источника

Если в качестве источника в тексте запроса необходимо использовать временную таблицу или вложенный запрос, то для этого случая можно использовать шаблон. В данном контексте использование временной таблицы или вложенного запроса – эквивалентно. В качестве примера рассмотрим как более предпочтительный вариант - вариант с использованием временной таблицы.

Случаи когда требуется цепочка преобразований:

  1. Источник запроса содержит объединение данных, которые необходимо предварительно сгруппировать
  2. Несколько запросов ссылаются на один источник – временную таблицу
  3. Запрос изначально очень сложный разбивается на несколько относительно простых последовательных запросов с помещением результата в промежуточную временную таблицу

В 1-ом случае шаблон будет такой (см. пример из шаблона "Выборка из временной таблицы"):

  1. Добавить запрос с помещением результата во временную таблицу
  2. Добавить запрос из временной таблицы

2-случай – это 1-ый + добавить несколько запросов из одной временной таблицы

3-ий (см. рисунок 4):

  1. Добавить запрос с помещением результата во временную таблицу с суффиксом _0
  2. Добавить запрос из временной таблицы с помещением результата во временную таблицу с суффиксом _1 и уничтожением текущей временной таблицы и т.д.

Текст модуля  

СхемаЗапроса    = Новый СхемаЗапроса;
////////////////////////////////////////////////////////////////////////////////
//  ЗАПРОС ПАКЕТА 0 Поместить во временную таблицу ВТ_ОБОРОТЫ_0 объединение 2-х операторов Выбрать
ЗапросПакета    = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса, "ВТ_ОБОРОТЫ_0");
//  1-ый оператор Выбрать
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать,
  "РегистрНакопления._ДемоОборотыПоСчетамНаОплату.Обороты", "_ДемоОборотыПоСчетамНаОплатуОбороты",
  Новый Структура("Периодичность,Условие", "Регистратор", "Номенклатура = &Товар"));
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Документ._ДемоЗаказПокупателя", "_ДемоЗаказПокупателя");
РаботаСоСхемойЗапроса.ДобавитьСоединение(ОператорВыбрать, "_ДемоОборотыПоСчетамНаОплатуОбороты", "_ДемоЗаказПокупателя", "_ДемоОборотыПоСчетамНаОплатуОбороты.Регистратор = _ДемоЗаказПокупателя.Ссылка");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоОборотыПоСчетамНаОплатуОбороты.Период", "Период");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоОборотыПоСчетамНаОплатуОбороты.Регистратор");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоОборотыПоСчетамНаОплатуОбороты.Номенклатура");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоЗаказПокупателя.Ссылка", "Ссылка");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоОборотыПоСчетамНаОплатуОбороты.СуммаОборот");
//  2-ой оператор Выбрать (добавлен копированием 1-го) 
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьКопиюОператора(ЗапросПакета, ОператорВыбрать);
//  Заменить условие виртуальной таблицы _ДемоОборотыПоСчетамНаОплатуОбороты 2-го оператора
Источник = ОператорВыбрать.Источники.НайтиПоПсевдониму("_ДемоОборотыПоСчетамНаОплатуОбороты");
РаботаСоСхемойЗапроса.УстановитьПараметрыВиртуальнойТаблицы(Источник, Новый Структура("Условие", "Номенклатура = &Услуга"));
////////////////////////////////////////////////////////////////////////////////
//  ЗАПРОС ПАКЕТА 1 Добавить запрос на основании виртуальной таблицы ВТ_ОБОРОТЫ_0 с её последующим уничтожением
ЗапросПакета      = РаботаСоСхемойЗапроса.ДобавитьЗапросПакетаИзТаблицы(СхемаЗапроса, "ВТ_ОБОРОТЫ_0",,,, Истина);
//  Модификация запроса путем добавления агрегатной функции к полю СуммаОборот из 1-го оператора Выбрать (запрос состоит из одного оператора Выбрать)
ОператорВыбрать = ЗапросПакета.Операторы[0];
РаботаСоСхемойЗапроса.УстановитьВыражениеПоля(ОператорВыбрать, "СУММА", "СуммаОборот");

Текст запроса 

ВЫБРАТЬ
  _ДемоОборотыПоСчетамНаОплатуОбороты.Период КАК Период,
  _ДемоОборотыПоСчетамНаОплатуОбороты.Регистратор КАК Регистратор,
  _ДемоОборотыПоСчетамНаОплатуОбороты.Номенклатура КАК Номенклатура,
  _ДемоЗаказПокупателя.Ссылка КАК Ссылка,
  _ДемоОборотыПоСчетамНаОплатуОбороты.СуммаОборот КАК СуммаОборот
ПОМЕСТИТЬ ВТ_ОБОРОТЫ_0
ИЗ
  РегистрНакопления._ДемоОборотыПоСчетамНаОплату.Обороты(, , Регистратор, Номенклатура = &Товар) КАК _ДемоОборотыПоСчетамНаОплатуОбороты
  ЛЕВОЕ СОЕДИНЕНИЕ Документ._ДемоЗаказПокупателя КАК _ДемоЗаказПокупателя
  ПО (_ДемоОборотыПоСчетамНаОплатуОбороты.Регистратор = _ДемоЗаказПокупателя.Ссылка)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
  _ДемоОборотыПоСчетамНаОплатуОбороты.Период,
  _ДемоОборотыПоСчетамНаОплатуОбороты.Регистратор,
  _ДемоОборотыПоСчетамНаОплатуОбороты.Номенклатура,
  _ДемоЗаказПокупателя.Ссылка,
  _ДемоОборотыПоСчетамНаОплатуОбороты.СуммаОборот
ИЗ
  РегистрНакопления._ДемоОборотыПоСчетамНаОплату.Обороты(, , Регистратор, Номенклатура = &Услуга) КАК _ДемоОборотыПоСчетамНаОплатуОбороты
  ЛЕВОЕ СОЕДИНЕНИЕ Документ._ДемоЗаказПокупателя КАК _ДемоЗаказПокупателя
  ПО (_ДемоОборотыПоСчетамНаОплатуОбороты.Регистратор = _ДемоЗаказПокупателя.Ссылка)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
  ВТ_ОБОРОТЫ_0.Период КАК Период,
  ВТ_ОБОРОТЫ_0.Регистратор КАК Регистратор,
  ВТ_ОБОРОТЫ_0.Номенклатура КАК Номенклатура,
  ВТ_ОБОРОТЫ_0.Ссылка КАК Ссылка,
  СУММА(ВТ_ОБОРОТЫ_0.СуммаОборот) КАК СуммаОборот
ИЗ
  ВТ_ОБОРОТЫ_0 КАК ВТ_ОБОРОТЫ_0
СГРУППИРОВАТЬ ПО
  ВТ_ОБОРОТЫ_0.Период,
  ВТ_ОБОРОТЫ_0.Регистратор,
  ВТ_ОБОРОТЫ_0.Номенклатура,
  ВТ_ОБОРОТЫ_0.Ссылка
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ВТ_ОБОРОТЫ_0

Шаблон «Ханойская башня» 

В ситуации использования нескольких объединений в запросе, когда структура операторов выбрать отличается незначительно: используются различные параметры виртуальных таблиц или отборы, различаются источники. Если при этом совпадают названия полей и структура соединений, то в таком запросе можно использовать базовый оператор выбрать для описания всех последующих операторов объединения.  

Согласно шаблону нужно описать первый оператор выбрать, затем 2-й и последующие операторы нужно добавить путем копирования первого. В копии оператора нужно при необходимости: заменить источники, поменять параметры виртуальных таблиц и настроить отбор. 

Следуя шаблону можно получить очень компактный код запроса с однотипными объединениями. 

 Текст модуля

СхемаЗапроса 	= Новый СхемаЗапроса;
////////////////////////////////////////////////////////////////////////////////
//  ЗАПРОС ПАКЕТА 0
ЗапросПакета 	= РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
//  Добавить образец оператора Выбрать
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Документ._ДемоПоступлениеТоваров", "Документы");
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "РегистрСведений.КурсыВалют.СрезПоследних", "КурсыВалютСрезПоследних");
РаботаСоСхемойЗапроса.ДобавитьСоединение(ОператорВыбрать, "Документы", "КурсыВалютСрезПоследних", "Документы.Валюта = КурсыВалютСрезПоследних.Валюта");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "Документы.Ссылка", "Ссылка");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "Документы.Валюта", "Валюта");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "КурсыВалютСрезПоследних.Курс", "Курс");
//  Добавить копию 1 оператора Выбрать и заменить источник
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьКопиюОператора(ЗапросПакета, ОператорВыбрать);
РаботаСоСхемойЗапроса.ЗаменитьИсточник(ЗапросПакета, ОператорВыбрать, "Документы", "Документ._ДемоРеализацияТоваров");
//  Добавить копию 2 оператора Выбрать и заменить источник
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьКопиюОператора(ЗапросПакета, ОператорВыбрать);
РаботаСоСхемойЗапроса.ЗаменитьИсточник(ЗапросПакета, ОператорВыбрать, "Документы", "Документ._ДемоЗаказПокупателя");

 Текст запроса

ВЫБРАТЬ
	Документы.Ссылка КАК Ссылка,
	Документы.Валюта КАК Валюта,
	КурсыВалютСрезПоследних.Курс КАК Курс
ИЗ
	Документ._ДемоПоступлениеТоваров КАК Документы
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
		ПО (Документы.Валюта = КурсыВалютСрезПоследних.Валюта)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	Документы.Ссылка,
	Документы.Валюта,
	КурсыВалютСрезПоследних.Курс
ИЗ
	Документ._ДемоРеализацияТоваров КАК Документы
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
		ПО (Документы.Валюта = КурсыВалютСрезПоследних.Валюта)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
	Документы.Ссылка,
	Документы.Валюта,
	КурсыВалютСрезПоследних.Курс
ИЗ
	Документ._ДемоЗаказПокупателя КАК Документы
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
		ПО (Документы.Валюта = КурсыВалютСрезПоследних.Валюта)

Шаблон «Расширение данных источника»

Рисунок 5. Расширение источника

Обычно в задачу запроса входит уменьшение выборки данных за счет установки дополнительных условий отбора и соединений. Рассматриваемый шаблон решает противоположную задачу – расширение данных выборки.

Для решения указанной задачи необходимо все внутренние соединения заменить на левые с дополнительным условием отбора на существование и расширить условия отбора. Реализация такого решения состоит из шагов:

  1.  «Расшить внутренние соединения» - заменить внутренние соединения на левые с добавлением условия существования (ГДЕ Не ПолеИсточникаСправа Есть Null)
  2. Все условия отбора объединить в группу И и поместить в группу ИЛИ
  3. Добавить в группу ИЛИ расширяющее условие

 Текст модуля

//  Пусть есть схема, состоящая из одного оператора Выбрать:
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса("ВЫБРАТЬ
|              _ДемоНоменклатура.Ссылка КАК Ссылка,
|              _ДемоНоменклатура.Код КАК Код,
|              _ДемоНоменклатура.Наименование КАК Наименование
|ИЗ
|              Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
|                                ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник._ДемоВидыНоменклатуры КАК _ДемоВидыНоменклатуры
|                                ПО _ДемоНоменклатура.ВидНоменклатуры = _ДемоВидыНоменклатуры.Ссылка");
//  Тогда для её модификации нужно извлечь оператор:
ОператорВыбрать = СхемаЗапроса.ПакетЗапросов[0].Операторы[0];
//  Обойти все внутренние соединения и заменить на левые с добавлением условия на существование
Для Каждого Источник Из ОператорВыбрать.Источники Цикл
  Для Каждого Соединение Из Источник.Соединения Цикл
    Если Соединение.ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее Тогда
      ИсточникСправа = Соединение.Источник.Источник;
      Соединение.ТипСоединения = ТипСоединенияСхемыЗапроса.ЛевоеВнешнее;
      ОператорВыбрать.Отбор.Добавить("НЕ "+ИсточникСправа.Псевдоним+"."+ИсточникСправа.ДоступныеПоля[0].Имя+" Есть Null");
    КонецЕсли;
  КонецЦикла;
КонецЦикла;
//  Выделить условия отбора в группу И и поместить в группу ИЛИ с добавлением расширяющего условия ЭтоГруппа
Если ОператорВыбрать.Отбор.Количество()>0 Тогда
  МассивУсловияОтбора = Новый Массив;
  Для Каждого Отбор Из ОператорВыбрать.Отбор Цикл
    МассивУсловияОтбора.Добавить(Строка(Отбор));
  КонецЦикла;
  ОператорВыбрать.Отбор.Очистить();
  ОператорВыбрать.Отбор.Добавить("("+СтрСоединить(МассивУсловияОтбора, ") И (")+") ИЛИ _ДемоНоменклатура.ЭтоГруппа");
КонецЕсли;

Результирующий текст запроса

ВЫБРАТЬ
  _ДемоНоменклатура.Ссылка КАК Ссылка,
  _ДемоНоменклатура.Код КАК Код,
  _ДемоНоменклатура.Наименование КАК Наименование
ИЗ
  Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
  ЛЕВОЕ СОЕДИНЕНИЕ Справочник._ДемоВидыНоменклатуры КАК _ДемоВидыНоменклатуры
  ПО _ДемоНоменклатура.ВидНоменклатуры = _ДемоВидыНоменклатуры.Ссылка
ГДЕ
  (НЕ _ДемоВидыНоменклатуры.Ссылка ЕСТЬ NULL
   ИЛИ _ДемоНоменклатура.ЭтоГруппа)

Примеры

Далее будут приведены примеры текстов запроса и модуль создания эквивалентной схемы запроса. Примеры приведены без оптимизации, полученные с помощью сервисной обработки "Конструктор схемы запроса".

Текст запроса

ВЫБРАТЬ
  _ДемоКонтрагенты.Ссылка КАК Ссылка
ИЗ
  Справочник._ДемоКонтрагенты КАК _ДемоКонтрагенты
ОБЪЕДИНИТЬ
ВЫБРАТЬ
  _ДемоПартнеры.Ссылка
ИЗ
  Справочник._ДемоПартнеры КАК _ДемоПартнеры

Текст модуля 

СхемаЗапроса    = Новый СхемаЗапроса;
////////////////////////////////////////////////////////////////////////////////
//  ЗАПРОС ПАКЕТА 0
ЗапросПакета    = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Справочник._ДемоКонтрагенты");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоКонтрагенты.Ссылка", "Ссылка");
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета, Новый Структура("ТипОбъединения", ТипОбъединенияСхемыЗапроса.Объединить));
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Справочник._ДемоПартнеры");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоПартнеры.Ссылка", "Ссылка");

Группировка

Текст запроса

ВЫБРАТЬ
  КОЛИЧЕСТВО(_ДемоБанковскиеСчета.Ссылка) КАК Ссылка,
  _ДемоБанковскиеСчета.Владелец КАК Владелец
ИЗ
  Справочник._ДемоБанковскиеСчета КАК _ДемоБанковскиеСчета
СГРУППИРОВАТЬ ПО
  _ДемоБанковскиеСчета.Владелец

Текст модуля 

СхемаЗапроса    = Новый СхемаЗапроса;
////////////////////////////////////////////////////////////////////////////////
//  ЗАПРОС ПАКЕТА 0
ЗапросПакета    = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Справочник._ДемоБанковскиеСчета");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "КОЛИЧЕСТВО(_ДемоБанковскиеСчета.Ссылка)", "Ссылка");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоБанковскиеСчета.Владелец");

Вложенный запрос

Текст запроса

ВЫБРАТЬ
  ВложенныйЗапрос.Ссылка КАК Ссылка
ИЗ
  (ВЫБРАТЬ
     _ДемоКонтрагенты.Ссылка КАК Ссылка
   ИЗ
     Справочник._ДемоКонтрагенты КАК _ДемоКонтрагенты
   ОБЪЕДИНИТЬ
   ВЫБРАТЬ
     _ДемоПартнеры.Ссылка
   ИЗ
     Справочник._ДемоПартнеры КАК _ДемоПартнеры) КАК ВложенныйЗапрос

Текст модуля 

СхемаЗапроса    = Новый СхемаЗапроса;
////////////////////////////////////////////////////////////////////////////////
//  ЗАПРОС ПАКЕТА 0
ЗапросПакета    = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
ВложенныйЗапросЗапросПакета = РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, РаботаСоСхемойЗапроса.ПолучитьОписаниеВложенногоЗапроса()).Источник.Запрос;
ВложенныйЗапросОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ВложенныйЗапросЗапросПакета);
РаботаСоСхемойЗапроса.ДобавитьИсточник(ВложенныйЗапросОператорВыбрать, "Справочник._ДемоКонтрагенты");
РаботаСоСхемойЗапроса.ДобавитьПоле(ВложенныйЗапросЗапросПакета, ВложенныйЗапросОператорВыбрать,, "_ДемоКонтрагенты.Ссылка", "Ссылка");
ВложенныйЗапросОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ВложенныйЗапросЗапросПакета, Новый Структура("ТипОбъединения", ТипОбъединенияСхемыЗапроса.Объединить));
РаботаСоСхемойЗапроса.ДобавитьИсточник(ВложенныйЗапросОператорВыбрать, "Справочник._ДемоПартнеры");
РаботаСоСхемойЗапроса.ДобавитьПоле(ВложенныйЗапросЗапросПакета, ВложенныйЗапросОператорВыбрать,, "_ДемоПартнеры.Ссылка", "Ссылка");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "ВложенныйЗапрос.Ссылка");

Шаблон "Работа с характеристиками"

Характеристики объекта представляют собой обычные соединения с таблицей, которая хранит значения характеристик объекта. В задачах, где требуется получить значения характеристик в одном соединении необходимо добавить столько соединений, сколько характеристик требуется получить.

Для примера возьмем значение характеристики номенклатуры из регистра сведений "Дополнительные характеристики" (демо-база БСП, см. также пример в Работа с данными выбора).

Объектная модель:

Текст модуля 

СхемаЗапроса      = Новый СхемаЗапроса;

ЗапросПакета       = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
ОператорВыбрать  = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
Источник                                 = РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Справочник._ДемоНоменклатура");
ИсточникСведения = РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "РегистрСведений.ДополнительныеСведения", "Сведение");
//  Далее используется функция добавить соединение с дополнительными сведениями
РаботаСоСхемойЗапроса.ДобавитьСоединение(ОператорВыбрать, Источник, ИсточникСведения, 
                  "_ДемоНоменклатура.Ссылка = Сведение.Объект                 И Сведение.Свойство = &Вид", 
                  ТипСоединенияСхемыЗапроса.Внутреннее);
ОператорВыбрать.Отбор.Добавить("Сведение.Значение = &Значение");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоНоменклатура.Ссылка");

Соответствующий запрос будет такой:

Текст запроса 

ВЫБРАТЬ
  _ДемоНоменклатура.Ссылка КАК Ссылка
ИЗ
  Справочник._ДемоНоменклатура КАК _ДемоНоменклатура
  ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ДополнительныеСведения КАК Сведение
  ПО (_ДемоНоменклатура.Ссылка = Сведение.Объект И Сведение.Свойство = &Вид)
ГДЕ
  Сведение.Значение = &Значение

При построении объектной модели условие соединения имеет определенную структуру: наложение условия на ссылку объекта и вид свойства. В более наглядной форме это соединение можно представить при использовании функции ДобавитьСоединениеХарактеристики:

Текст модуля 

СхемаЗапроса      = Новый СхемаЗапроса;

ЗапросПакета       = РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
ОператорВыбрать  = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
Источник                                 = РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Справочник._ДемоНоменклатура");
ИсточникСведения = РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "РегистрСведений.ДополнительныеСведения", "Сведение");
//  Далее используется функция добавить соединение с характеристикой
РаботаСоСхемойЗапроса.ДобавитьСоединениеХарактеристики(ОператорВыбрать, Источник, ИсточникСведения, "Ссылка",
                  "Объект", "Свойство", "&Вид", ТипСоединенияСхемыЗапроса.Внутреннее);
РаботаСоСхемойЗапроса.ДобавитьОтбор(ОператорВыбрать, "Сведение.Значение = &Значение");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "_ДемоНоменклатура.Ссылка");

Приложения

Рисунок 6. Конструктор схемы запроса

В задачу перевода программного кода от использования текста к использованию схемы запроса можно существенно упростить, если воспользоваться автоматизированной генерацией программного кода на основе текста запроса.

Текст запроса взаимно-однозначно описывается схемой запроса. Таким образом задача преобразования исходного текста в программный код с использованием схемы становится простой.

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

После получения текста модуля его можно оптимизировать. Для оптимизации можно задействовать сервисные функции. Рекомендую объединять условия соединений и отборов - так код будет выглядеть более компактно, а на результат это не влияет.

Поставка

Решение поставляется в виде конфигурации. Подсистема использует общие процедуры БСП. Перед объединением сбросьте признак объединять свойства конфигурации.

Таблица 3. Состав поставки

Метаданные

Наименование

Назначение

Ограничения

ОбщийМодуль

ОбщийКлиентСервер

Вспомогательные процедуры и функции

 

 

РаботаСоСхемойЗапроса

Основные функции подсистемы

 

Обработка

Конструктор схемы запроса

Конвертация текста запроса в программный код

Использует библиотеку Regex.dll

 


Обновления в версии 1.02:

  • Уточнены параметры функции ДобавитьОператор
  • Изменена функция ДобавитьКопиюОператора: добавлено копирование отбора и возможность установки параметров оператора
  • Добавлена процедура ЗаменитьИсточник (см. описание в API)
  • Добавлена глава Шаблон "Ханойская башня"

Обновления в версии 1.03:

  • Исправлено копирование полей для функции ДобавитьКопиюОператора. Ранее могла возникнуть ситуация, когда при копировании поля привязывались к другому порядку колонок запроса
  • Дополнен комментарий к УстановитьВыражениеПоля
  • Конструктор схемы запроса: добавлена обработка свойства порядка АВТОУПОРЯДОЧИВАНИЕ

Обновления в версии 1.04:

  • ДобавитьСоединение - добавлен параметр Заменить
  • ДобавитьУсловиеСоединения - функция стала внутреннего использования
  • УстановитьИндексЗапросаПакета - исправлено наименование параметра
  • ДобавитьУсловиеОграниченияПоВидуДоступа - добавлен новый метод
  • ЗаменитьИсточник - добавлен необязательный параметр ПараметрыВиртуальнойТаблицы
  • ДобавитьПоле - параметр Оператор можно не передавать, будет использован последний
  • ДобавитьИсточник - убрано добавление полей по описанию временной таблицы
  • ДобавитьЗапросПакетаИзТаблицы - добавлена обработка параметра ТаблицаИсточника на основании описания временной таблицы
  • ДобавитьОтбор - новая процедура, позволяет добавлять отбор через использование запроса пакета
  • ПолучитьОписаниеВременнойТаблицы - тип доступного поля временной таблицы из менеджера временных таблиц устанавливатся в неопределено для типа Строка. Это связано с неправильной обработкой этого поля, когда по нему делаются соединения: возникает ошибка сравнения полей несовместимых типов. Установка типа поля в неопределено никаких ограничений за собой не несет, т.к. эта информация используется только на этапе построений схемы запроса и не учитывается при непосредсвенном выполнении запроса.

Обновления в версии 1.05:

Исправления и обновления:

  • ДобавитьПоле - добавлено примечание: можно использовать для замены существующего поля, если использовать тот же псевдоним
  • ДобавитьУсловиеХарактеристики - исправлена ошибка
  • ДобавитьУсловиеОграниченияПоВидуДоступа - добавлено описание

Новые функции:

  • УстановитьВыражениеПолей
  • ИзменитьПсевдонимКолонки
  • УдалитьКолонку
  • ДобавитьУсловиеХарактеристики

 Удаление:

  • ДобавитьУсловиеХарактеристики - признана устаревшей и удалена. Нужно использовать ДобавитьУсловиеХарактеристики

Обновления в версии 1.06:

Добавлена поддержка индексов временной таблицы и итогов. Теперь конструктор схемы запроса поддерживает полную объектную модель запроса.

Новые функции:

  • ДобавитьИтог

Обновления в версии 1.07 (2018.07.27):

Исправления:

  • УстановитьИндексЗапросаПакета - реализация приведена в соответствие с версией платформой 8.3.11
  • ДобавитьОператор - уточнен алгоритм для случая оператора выбрать без источников

Обновления в версии 1.08 (2018.08.02):

Исправления:

  • ДобавитьОператор - в функции уточнено получение нового оператора: если по нулевому индексу оператор имеет хоть одно поле или хоть один источник, то добавляется новый, иначе - переиспользуется с нулевым индексом

Обновления в версии 2.0.0.1 (2019.02.06):

Рефакторинг. Изменены наименования функций, старые помечены как устаревшие:

  • ДобавитьЗапросПакета->ЗапросПакета
  • ДобавитьЗапросПакетаИзТаблицы->ЗапросПакетаИзТаблицы
  • ДобавитьОператор->Оператор
  • ДобавитьКопиюОператора->КопияОператора
  • ДобавитьИсточник->Источник
  • ДобавитьПоле->Поле
  • УстановитьВыражениеПоля->ВыражениеПоля
  • ДобавитьПорядок->Порядок
  • ПолучитьОписаниеВременнойТаблицы->ОписаниеВременнойТаблицы
  • ПолучитьОписаниеВложенногоЗапроса->ОписаниеВложенногоЗапроса
  • ДобавитьСоединение->Соединение
  • СоздатьЗапрос->Запрос
  • ДобавитьОтбор->Оператор.Отбор.Добавить()
  • ДобавитьИтог->Итог

Изменения в функциях:

  • Поле    - добавлена возможность добавить доступные поля через указание "*" или через запятую
  • ЗапросПакета - добавлен параметр ОператорВыбрать, теперь нет нужды отдельно получать оператор, достаточно сразу при получении пакета
  • ЗапросПакетаИзТаблицы - добавлен параметр ОператорВыбрать
  • УдалитьКолонку, УдалитьПоле - добавлено безопасное удаление: если колонки/поля по имени нет, то ничего не происходит
  • ОписаниеВременнойТаблицы - добавлен параметр Колонки, расширен список источников: таблица значений, временная таблица

Новые функции:

  • УдалитьИсточник
  • Добавлены процедуры работы с компоновкой данных:
    • СкопироватьЭлементыСхемыЗапроса
    • СхемаЗапросаКомпоновкиДанных - Конструирует схему запроса по описанию из схемы компоновки данных
    • СкопироватьОтборКомпоновкиДанных - Копирует условия отбора из элементов СКД в отбор оператора схемы запроса

Улучшения:

  • Структурирование модуля по областям, добавление комментариев в формате 1С
  • Обновлена обработка "Конструктор схемы запроса": изменена компоновка генерируемого кода, код приведен в соответствие к новым функциям

Обновления в версии 2.0.0.2 (2019.03.03):

Изменения в функциях: 

  • ОписаниеВременнойТаблицы - При конструировании типов полей временной таблицы для строкового типа определяется тип Неопределено. Это сделано для того, чтобы тип не определялся как строка неограниченной длины

Обновлена обработка "Конструктор схемы запроса":

  • Добавлены параметры первого оператора выбрать, которые были "потеряны" при переходе на новый стиль генерируемого кода
  • Добавлено имя временной таблицы в комментарий запроса пакета

Скачать файлы

Наименование Файл Версия Размер
Работа со схемой запроса:
.cf 57,21Kb
06.02.19
48
.cf 2.0.0.2 57,21Kb 48 Скачать

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. Steelvan 24.04.18 10:09 Сейчас в теме
Попозже подробнее ознакомлюсь.
2. BigB 179 24.04.18 15:01 Сейчас в теме
3. kalyaka 576 24.04.18 15:11 Сейчас в теме
В этой подсистеме не используется БСП. Это я ввел в заблуждение.

Дело в том, что эта подсистема хотя и является самостоятельной, задумывалась как составная более крупной, в которой как раз БСП уже используется.
5. webester 32 25.04.18 15:37 Сейчас в теме
Для понимания объектной модели запроса очень помогла эта статья: https://infostart.ru/public/307045/ и вот эта обработка для раскуривания сложных запросов https://infostart.ru/public/305809/
Resident1C; +1 Ответить
6. kalyaka 576 25.04.18 16:09 Сейчас в теме
(5) схему из 1-ой статьи я использую как дополнение к типовой справке и сейчас. Аналог обработки из 2-ой (https://infostart.ru/public/307066/) я использовал по началу, но мне очень не нравился код на выходе.
7. Fragster 1002 25.04.18 16:17 Сейчас в теме
Все равно неудобно. Построитель запросов и СтрЗаменить(Текст, "&_Плейсхолдер", "Нужный фрагмент") удобнее намного и для понимания и для доработки. Ну или в сложных случаях - скд (когда требуются плюшки типа необязательных таблиц или параметров).
8. kalyaka 576 25.04.18 16:44 Сейчас в теме
(7) Смотря что понимать под удобством.
Я понимаю под «удобством» лучшую читаемость кода. Когда я читаю что-то типа: СтрЗаменить(Текст, Чтото, НаЧтото) -, то это мало что говорит о происходящем с самим запросом. Другое дело, когда в коде что-то типа такого: ОператорВыбрать.Отбор.Добавить(«Контрагент.Плейсхолдер = &Плейсхолдер»);
10. Fragster 1002 26.04.18 13:06 Сейчас в теме
(8) Просто надо задавать правильные "чтото", например &_Звездочка (это обход разворачивания звездочки во все поля конструктором;) ), &_ОтборКонтрагентов и т.п. И тогда СтрЗаменить(Текст, Чтото, НаЧтото) становится намного понятнее. А ОператорВыбрать.Отбор.Добавить(«Контрагент.Плейсхолдер = &Плейсхолдер») запросто ломается при добавлении временной таблицы или еще одной таблицы в соединение...
Ну а полностью собирать текст запроса с помощью схемы - это вообще мазохизм, загружать из строки и чуть менять - более менее, но все равно неудобно из-за того, что часто при изменении исходного запроса надо переделывать код, причем очень аккуратно.
11. kalyaka 576 26.04.18 14:50 Сейчас в теме
(10) Допускаю, что работу с текстом можно сделать понятнее, но это все равно будет работа с текстом и только в конце результат будет загружен в запрос. Вероятность допустить ошибку при конструировании текста будет выше, т.к. при работе с моделью Вам не нужно держать модель в голове.

запросто ломается при добавлении временной таблицы или еще одной таблицы в соединение...

Почему же ломается схема при добавлении временной таблицы или соединения? Вот пример добавления временной таблицы и соединения с ней:
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Документ.СписаниеСРасчетногоСчета", "Документы");
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "ВТ_ПЕРИОДЫ_ВГО");
РаботаСоСхемойЗапроса.ДобавитьСоединение(ОператорВыбрать, "Документы", "ВТ_ПЕРИОДЫ_ВГО", "ВТ_ПЕРИОДЫ_ВГО.Контрагент = Документы.Контрагент
|  И Документы.Дата МЕЖДУ ВТ_ПЕРИОДЫ_ВГО.ДатаНачала И ВТ_ПЕРИОДЫ_ВГО.ДатаОкончания", ТипСоединенияСхемыЗапроса.Внутреннее);
ОператорВыбрать.Отбор.Добавить("Документы.Проведен
|  И Документы.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания");


полностью собирать текст запроса с помощью схемы - это вообще мазохизм

Тоже не соглашусь. При разработки подсистемы я преследовал цель: добиться более краткого и понятного кода построения текста запроса средствами модели. Для маленьких запросов краткость не заметна, а для больших с повторениями структур код заметно компактнее (см. использование шаблонов).
Вот пример маленького запроса:
СхемаЗапроса 	= Новый СхемаЗапроса;
////////////////////////////////////////////////////////////­////////////////////
//  ЗАПРОС ПАКЕТА 0
ЗапросПакета 	= РаботаСоСхемойЗапроса.ДобавитьЗапросПакета(СхемаЗапроса);
ОператорВыбрать = РаботаСоСхемойЗапроса.ДобавитьОператор(ЗапросПакета);
РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "Документ.ПриходныйКассовыйОрдер");
ОператорВыбрать.Отбор.Добавить("ПриходныйКассовыйОрдер.Проведен
| И ПриходныйКассовыйОрдер.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "ПриходныйКассовыйОрдер.Ссылка");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "ПриходныйКассовыйОрдер.Организация");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "ПриходныйКассовыйОрдер.Контрагент");
РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "ПриходныйКассовыйОрдер.СуммаДокумента");
РаботаСоСхемойЗапроса.ДобавитьПорядок(ЗапросПакета, "Ссылка");
ЗапросПакета.Автопорядок = Истина;
Выборка = РаботаСоСхемойЗапроса.СоздатьЗапрос(СхемаЗапроса, Новый Структура("ДатаНачала,ДатаОкончания", ДатаНачала,ДатаОкончания)).Выполнить().Выбрать();
Показать

На мой взгляд с таким кодом можно вполне нормально работать и изменять, добавляя новые источники, соединения и т.д.
12. Fragster 1002 26.04.18 16:00 Сейчас в теме
(11)
Почему же ломается схема при добавлении временной таблицы или соединения

я про случай когда в схему загружается текст запроса, в схеме меняются индексы подзапросов, таблиц, полей и т.п.


(11)
полностью собирать текст запроса с помощью схемы - это вообще мазохизм

Теперь сравните скорость, трудоемкость и "напряжение ума" с конструктором запросов, даже в вашем примере. Например для добавления всех полей. Или группировку с функциями, всякими "естьNULL" и прочими "Имеющие".
14. kalyaka 576 27.04.18 09:12 Сейчас в теме
(12)
я про случай когда в схему загружается текст запроса, в схеме меняются индексы подзапросов, таблиц, полей и т.п.

Это да, есть такая особенность объекта схемы. В статье я обозначил такое поведение и в своей подсистеме я реализовал обход некоторых интерактивных изменений, которые на мой взгляд приводят к неоднозначностям. С другой стороны, когда удаляется поле, то логично что и условия с этим полем также будут удалены или когда к полю применяется агрегатная функция, то однозначно появляются группировки по всем остальным полям.

В общем здесь разработчики поступили просто: взяли интерактивный конструктор запросов и открыли API к его объектам и функциям, однако требования к интерактивной работе и на программном уровне все таки различаются - в 1-ом случае происходит взаимодействие с человеком, а во втором нужна просто однозначность поведения.

Теперь сравните скорость, трудоемкость и "напряжение ума" с конструктором запросов, даже в вашем примере. Например для добавления всех полей. Или группировку с функциями, всякими "естьNULL" и прочими "Имеющие"

Согласен, не стоит лишний раз напрягать мозги, когда рутинные действия можно автоматизировать. Для конструирования и отладки кода я и сделал обработку "Конструктор схемы запроса". Работать с ней можно как от исходного текста запроса или с интерактивным конструктором запроса, так и при отладке кода со схемой запроса. В 1-ом случае можно быстро получить работающий код со схемой, во 2-ом - оптимизировать код с использованием шаблонов или иными способами. Для отладки кода нужно в окне текста модуля произвести необходимые изменения и получить текст запроса.
16. Dmitriy_Kolesnikov 11.10.18 10:25 Сейчас в теме
Подскажите, как работает функция ЗаменитьИсточник?
17. kalyaka 576 11.10.18 11:45 Сейчас в теме
(16) Используется метод Заменить источника схемы запроса:
Оператор.Источники.Заменить(ИндексИсточника, ДоступнаяТаблица)

Описание процедуры из подсистемы:

// Заменяет источник оператора выбрать с сохранением соединений и псевдонима.
//
// Параметры:
//  ЗапросПакета - ЗапросСхемыЗапроса
//  Оператор     - ОператорСхемыЗапроса
//  Источник     - Строка - Псевдоним источника
//			     - ИсточникСхемыЗапроса
//  Таблица      - Строка - Имя доступной таблицы (формат в справке Работа с запросами - Таблицы запросов). Если нужно передать имя временной таблицы, то указать ВременнаяТаблица.ИмяТаблицы
//  Псевдоним    - Строка - если задан, то будет заменен на псевдоним. Если использовать "*", то будет использован псевдоним по-умолчанию из имени таблицы
//	ПараметрыВиртуальнойТаблицы - Структура - ключи структуры соответствуют названиям параметров виртуальной таблицы из справки в конфигураторе без пробелов. 
//
// Пример:
//  ЗаменитьИсточник(ЗапросПакета, ОператорВыбрать, "Документы", "Документ.ПоступлениеНаРасчетныйСчет");
Процедура ЗаменитьИсточник(ЗапросПакета, Знач Оператор = Неопределено, Знач Источник, Таблица, Знач Псевдоним = "", ПараметрыВиртуальнойТаблицы = Неопределено) Экспорт
Показать
18. Dmitriy_Kolesnikov 14.10.18 02:41 Сейчас в теме
(17)
ИсточникСхемыЗапроса

У этого объекта есть метод Заменить.
Его параметром является НовыйИсточник типа ДоступнаяТаблицаСхемыЗапроса.
Вопрос в том, как создать ДоступнаяТаблицаСхемыЗапроса.
Конструктора у этого объекта нет.
Получить его неоткуда.
Всё, что я знаю - имя новой таблицы.
Как из имени таблицы получить объект ДоступнаяТаблицаСхемыЗапроса?
19. kalyaka 576 15.10.18 10:01 Сейчас в теме
(18) Доступные таблицы можно получить из коллекции ДоступныеТаблицы объекта ЗапросПакета. Следующий код выведет все доступные таблицы текущей конфигурации:
---
СхемаЗапроса = Новый СхемаЗапроса;
	ЗапросПакета = СхемаЗапроса.ПакетЗапросов.Добавить(Тип("ЗапросВыбораСхемыЗапроса"));
	ДоступныеТаблицы = ЗапросПакета.ДоступныеТаблицы;
	Для Каждого ДоступнаяГруппаТаблиц Из ДоступныеТаблицы Цикл
		Сообщить("***"+ДоступнаяГруппаТаблиц.Представление+"***");
		Для каждого ДоступнаяТаблица Из ДоступнаяГруппаТаблиц.Состав Цикл
			Сообщить(ДоступнаяТаблица.Имя);
		КонецЦикла;
	КонецЦикла;
Показать

---
Пример вывода:

***Справочники***
Справочник.БанковскиеСчета
Справочник.БанковскиеСчета.Изменения
Справочник.Валюты
Справочник.Валюты.Изменения
Справочник.ВариантыОтчетов
Справочник.ВариантыОтчетов.Изменения
20. Boneman 257 15.10.18 10:13 Сейчас в теме
Баловство это все )) Когда только появилась схема запроса, я ее немного повтыкал в разных разработках..так, ради интереса, и расширения познаний. А потом забил на это, все-таки запрос поудобнее да и попривычнее будет.
В типовых конфигурациях, тоже, пока не встречал применения схемы запроса. Пусть сначала сами 1С-овцы начнут ее применять у себя, а там посмотрим.
Достаточно просто знать, что да, есть такой конструктор, можно текст запроса и по другому формировать.
А так, как в анекдоте,- " и нафига нам эти навороты в зоопарке."
21. trustasia 13 19.11.18 05:45 Сейчас в теме
(20)однако, надо поддерживать новое, качну пожалуй, вкурюсь
22. trustasia 13 19.11.18 06:02 Сейчас в теме
а вкуривать надо пожалуй начиная еще отсюда
https://infostart.ru/public/307045/
23. AllexSoft 06.02.19 00:24 Сейчас в теме
Нужная библеотека, пока в платформе не придумали подобных методов у схемы запроса.
ПС: архив для скачивания под макосью что ли собирался? Какая то проблема с кодировкой имен файлов в архиве. Не дело.. Открываю через 7zip
24. kalyaka 576 06.02.19 08:28 Сейчас в теме
(23)
пока в платформе не придумали подобных методов у схемы запроса
Согласен, платформа сильно отстает от потребностей разработчиков. Взять тот же БСП, все то что не относится к прикладной области нужно вынести на уровень реализации в платформе.

Однако реальность такова, что платформа развивается по своим приоритетам, а возникающие потребности разработчиков приходится закрывать библиотеками, написанными на встроенном языке.
Какая то проблема с кодировкой имен
Действительно архив собирал под маком, исправлю в следующем обновлении.

На этой неделе планирую выложить существенно обновленную версию: проведен рефакторинг, позволяющий улучшить выразительность кода, добавлена поддержка работы с СКД, обновлен конструктор схемы: улучшена выразительность кода модуля схемы запроса.
25. AllexSoft 07.02.19 00:21 Сейчас в теме
(24) попробовал в деле вашу библиотеку. Вот какие выводы:
1. Общие модули переименовать с префиксом, напимер сз_РаботаСоСхемойЗапроса. Ведь в сильно измененных конфигурациях без прификсов никуда - для того что бы визуально отличать свои объекты от типовых. У себя пришлось переименовать модули и вызовы их соответственно
2. Библиотека заточена насколько я понял под конструирование запросов "с нуля", но чаще всего задачи все же изменение типового уже готового запроса программным путем через объектную модель. И вот тут не хватает функции поиска по пакетам запросов, к примеру: ЗапросПакета = РаботаСоСхемойЗапроса.НайтиПакетЗапроса(СхемаЗапроса, "втТаблицаТовары"), а то в современных типовых там запросы из стольки пакетов состоят.. сами знаете)
2.1. К предыдущему пункту - в статье не хватает самых простых примеров использования, добавление левым соединением доп. таблицы и колонки к существующему запросу или добавление поля к существующему запросу.
В примере "Построение текста запроса по параметрам отбора»" есть набросок, но в этом примере в строке РаботаСоСхемойЗапроса.ДобавитьУсловиеХарактеристики(ОператорВыбрать, Источник, "РегистрСведений.ДополнительныеСвойства»" "", "", …);
используется переменная ОператорВыбрать, которая выше никак не определена, тип ее не ясен, как она инициировалась не понятно. В общем потратив время разобраться можно конечно...
Оставлю тут готовый кусок кода модификации запроса, для тех кто начинает знакомство с библиотекой, может кому поможет
        Схема = Новый СхемаЗапроса;
	Схема.УстановитьТекстЗапроса(ТекстЗапроса);
	ОператорВыбрать = Схема.ПакетЗапросов[0].Операторы[0];
	ЗапросПакета = Схема.ПакетЗапросов[0];
	
	//  Источники
	РаботаСоСхемойЗапроса.ДобавитьИсточник(ОператорВыбрать, "РегистрСведений.ПолученныеОригиналыДокументов");
	//  Соединения
	РаботаСоСхемойЗапроса.ДобавитьСоединение(ОператорВыбрать, "ДокументРеализацияТоваровУслуг", "ПолученныеОригиналыДокументов", "ДокументРеализацияТоваровУслуг.Ссылка = ПолученныеОригиналыДокументов.Документ");
	//  Поля
	РаботаСоСхемойЗапроса.ДобавитьПоле(ЗапросПакета, ОператорВыбрать,, "ПолученныеОригиналыДокументов.ПолученЧерезЭДО");
	
	ТекстЗапроса = Схема.ПолучитьТекстЗапроса();
Показать


3. По коду модулей, не хватает объединения в области, к хорошему быстро привыкаешь ...
4. Зачем там второй модуль общих функций не совсем понял, тем более там используется всего лишь несколько функций оттуда, может есть смысл запихнуть их в модуль РаботаСоСхемойЗапроса и избавится от доп. сервисного модуля общих функций.

А так библиотека понравилась, буду пользоваться и жду обновлений
26. kalyaka 576 07.02.19 09:36 Сейчас в теме
(25)
1. Общие модули переименовать с префиксом
Я очень тщательно подхожу к выбору наименований названий модулей, функций, переменных. Критерий удачного выбора - выразительность написанного кода, когда смысл понятен без комментариев.

В свое время, программируя на языках общего назначения, я вначале придерживался системы префиксов, однако на практике стало ясно, что т.к. количество возможных типов неограничено, то и смысл в использовании префиксов пропадает - лучше использовать верблюжью нотацию. Кстати про это еще Джоэль Спольски писал, а Microsoft прошла тот же путь (Спольски про это писал), что и я и тоже отказалась от пропаганды префиксной нотации.

Ваш довод по поводу пересечения названий я понимаю. Возможно выходом может быть постобработка модулей перед внедрением, как вы и сделали, только автоматизированно. Тогда каждый сможет выбирать какой ему префикс использовать. У меня отношение к префиксам отрицательное.
2. Библиотека заточена насколько я понял под конструирование запросов "с нуля"
Действительно, библиотека родилась из практической потребности в алгоритмическом конструировании сложных запросов в нетиповой конфигурации с нуля. В ней есть функции по модификации: УдалитьИсточник, ЗаменитьИсточник, КопияОператора, ЗапросПакетаИзТаблицы, ВыражениеПоля - все они заточены на переиспользование пакетов и операторов при построении схемы.

Еще библиотека позволяет строить схему на основании промежуточных данных из менеджера временных таблиц или из таблицы значений.

Библиотека уже как год выложена, у нее несколько десятков скачиваний, однако действительно конструктивных предложений пока не поступало, и Ваше первое. Хотелось бы, чтобы сообщество более активно участвовала в ее развитии, делясь своими впечатлениями и предложениями.

Включу в будущую версию функции по модификации существующих запросов.
2.1. К предыдущему пункту - в статье не хватает самых простых примеров использования
ОператорВыбрать определяется при построении схемы с нуля естественным образом, в новой версии в вызове функции ЗапросПакета.

Перед началом использования библиотеки рекомендую поиграться обработкой конструктора. В конструкторе можно увидеть рабочие примеры кода на основе любого запроса (даже с использованием индексов и итогов). Правда Конструктор раскрывает не все возможности библиотеки и это я планирую исправить в реализации его расширенной версии.
3. По коду модулей, не хватает объединения в области
Уже выложил с выделением областей.
4. Зачем там второй модуль общих функций не совсем понял
Я веду разработку нескольких универсальных библиотек, которые используют как общие модули из БСП, так и мои. Работа со схемой - это одна из. На будущее думаю сделать что-то типа автоматизированной поставки, когда функциональность отдельной библиотеки "выкусывается" из общей и в "очищенном" виде поставляется.

Спасибо за конструктивный отзыв!
27. AllexSoft 07.02.19 10:33 Сейчас в теме
(26)
(26)
В свое время, программируя на языках общего назначения, я вначале придерживался системы префиксов, однако на практике стало ясно, что т.к. количество возможных типов неограничено, то и смысл в использовании префиксов пропадает - лучше использовать верблюжью нотацию.

Я то же сторонник верблюжьей нотации, но тут есть одно но, 1С то же сторонник ее же, в итоге в сравнении\объединении в сильно измененных конфах не разберетесь где свое, а где типовое, просто по причине того что все написано единообразно и модуль РаботаСоСхемойЗапроса потеряется в куче БСПшных модулей типа РаботаСФайлами, РаботаСКонтрагентами, РаботаСБанками и тд.. собственно поэтому используем такую систему <общий префикс доработок>_<префикс типа объекта>_<наименование объекта>_<функциональное описание>
получается что то типа
пт_Док_РеализацияТоваровУслуг_Сервер
пт_Рег_ШтрихкодыНоменклатуры_Сервер
и тд.. в дереве метаданных есть же быстрый поиск, собственно вводим туда пт_ - получаем все доработанные объекты, _Док - доработанные объекты только по документам, ну и тд.
В нашей конфе (УТ11) например только добавленных общих модулей больше 100, больше 150 своих подписок, около 50 регистров сведений своих, ну и само собой кучу типовых объектов измененных. И вот представьте нам надо обновить УТ 11.0 (релиз от 2013 года), до УТ 11.4.6 (релиз 2019 года), без потери данных. именно обновить, а не перенести остатки) Там разработчик УТ уже все поменял, а тут еще наши изменения.. без какого то визуального разделения функционала это просто нереальная задача, а визуально разделить только префиксом возможно, к сожалению (группы объектов в дереве метаданных в 1С не придумали к сожалению).
Прикрепил скрин из нашей конфы, думаю понятно будет в чем плюсы нашего подхода) Касаемо конечно сильно измененных типовых конфигураций.


(26)
Перед началом использования библиотеки рекомендую поиграться обработкой конструктора.

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


(26)
Я веду разработку нескольких универсальных библиотек, которые используют как общие модули из БСП, так и мои. Работа со схемой - это одна из. На будущее думаю сделать что-то типа автоматизированной поставки, когда функциональность отдельной библиотеки "выкусывается" из общей и в "очищенном" виде поставляется.

у меня то же есть несколько довольно больших подсистем и могу вам сказать из личного опыта лучше идти по пути переопределяемых модулей (как и в БСП) - прокси вызовов БСП, своих сервисных модулей и тд. Ведь у пользователей будет целый зоопарк из версий БСП, в которых функции постоянно переименовывают и перемещают. Ну и собственно сделать модуль скажем РаботаСоСхемойЗапросаПереопределяемый, а там что нибудь типа
Функция ОкончаниеСтрокиПослеРазделителя(Строка, Разделитель = ".") Экспорт
	Возврат ОбщийКлиентСервер.ОкончаниеСтрокиПослеРазделителя(Строка, Разделитель) ;
КонецФункции

собственно и "выкусывать" при автоматизированной поставке будет проще гораздо, ведь придется обрабатывать только относительно простые переопределямые модули - прокси. Да и адаптировать к различным конфам и версиям БСП намного проще
Прикрепленные файлы:
28. AllexSoft 07.02.19 14:38 Сейчас в теме
Скачал новую версию 2.0.0.1
1. ОбщийКлиентСервер, забыли изменить версию // Версия 1.02
хотя изменения по коду есть (объединялось сравнением\объединением)
2. в модуле РаботаСоСхемойЗапроса, зачем то затесались функции по СКД. Лучше их выделить в отдельный модуль, тем более поставляете же модуль КомпановкаДанных и КомпановкаДанныхКлиентСервер - там им самое место. У себя пришлось вырезать, так как я эти два модуля не внедряю, по скд есть и БСПшный функционал + свой, эти модули далеко не всем нужны будут точно.
3. В Функция СхемаЗапросаКомпоновкиДанных, есть вызов com -объекта, лучше от него избавится, по коду особо не вчитывался, но насколько я вижу это можно переписать и без regexp. Иначе нужно обозначить что библиотека работает только на Windows
4. Конструктор схемы запроса: куда делись комментарии между блоками соединения, источники и тд.. а сейчас общей кучей, так гораздо хуже. если запрос большой фиг разберешься где какой источник добавляется, где к нему поля.. и тд.. лучше наоборот больше комментариев типа
//источники - РеализацияТоваровУслуг
....
//Источники - вложенный запрос взТовары

и тд.. вот пытался разобрать запрос с несколькими вложенными запросами и кучей источников в одном пакете, жуть )
29. kalyaka 576 08.02.19 09:39 Сейчас в теме
(28)
1. ОбщийКлиентСервер, забыли изменить версию
Пока нет управления зависимостями как в onescript - не критично :)
2. в модуле РаботаСоСхемойЗапроса, зачем то затесались функции по СКД
Эти функции мне потребовались при работе с универсальными отборами, когда на их основе нужно построить запрос (встроить условия из СКД в запрос)
3. В Функция СхемаЗапросаКомпоновкиДанных, есть вызов com -объекта
Там используется regexp для конвертации параметров отбора СКД в выражениях условий. Далее я планирую еще шире использовать регулярные выражения, например, для описания состава полей.
4. Конструктор схемы запроса: куда делись комментарии между блоками соединения
В конструкторе есть галочка "Добавить комментарии", по всей видимости вам не хватило. Ок, в следующей версии добавлю еще, например, ваше предложение в запросы пакета добавить в комментарий имя временной таблицы или имя первого источника - принято :).
вот пытался разобрать запрос с несколькими вложенными запросами
Могу себе представить. Вложенные запросы очень громоздки и плохо оптимизируются при исполнении. Вместо подзапросов рекомендую использовать временные таблицы.

Работа с временными таблицами хорошо поддерживается библиотекой. Например, нужно выбрать таблицу значений в объединении с таблицей из базы с расчетом суммы разницы по полю Количество:
Перем СхемаЗапроса, ОператорВыбрать;

Таблица = Документы._ДемоРеализацияТоваров.СоздатьДокумент().Товары.Выгрузить();
////////////////////////////////////////////////////////////­////////////////////
//  ЗАПРОС ПАКЕТА 0. ВТ_ТОВАРЫ_0 Выбор из таблицы
РаботаСоСхемойЗапроса.ЗапросПакетаИзТаблицы(СхемаЗапроса, РаботаСоСхемойЗапроса.ОписаниеВременнойТаблицы("&Товары", Таблица),, "*", "ВТ_ТОВАРЫ_0",,,, Истина);
////////////////////////////////////////////////////////////­////////////////////
//  ЗАПРОС ПАКЕТА 1. ВТ_ТОВАРЫ_1 Объединение таблицы с данными из базы
ЗапросПакета = РаботаСоСхемойЗапроса.ЗапросПакетаИзТаблицы(СхемаЗапроса, "ВТ_ТОВАРЫ_0",, "*", "ВТ_ТОВАРЫ_1",,, ОператорВыбрать);
ОператорВыбрать = РаботаСоСхемойЗапроса.КопияОператора(ЗапросПакета, ОператорВыбрать);
РаботаСоСхемойЗапроса.ЗаменитьИсточник(ЗапросПакета, ОператорВыбрать, "ВТ_ТОВАРЫ_1", "Документ._ДемоРеализацияТоваров.Товары");
ОператорВыбрать.Отбор.Добавить("ВТ_ТОВАРЫ_1.Номенклатура = &Номенклатура");
РаботаСоСхемойЗапроса.ВыражениеПоля(ОператорВыбрать,, "Количество", "-Количество");
РаботаСоСхемойЗапроса.УдалитьКолонку(ЗапросПакета, "НомерСтроки");
РаботаСоСхемойЗапроса.УдалитьКолонку(ЗапросПакета, "Цена");
////////////////////////////////////////////////////////////­////////////////////
//  ЗАПРОС ПАКЕТА 2. ВТ_ТОВАРЫ Группировка результата
ЗапросПакета = РаботаСоСхемойЗапроса.ЗапросПакетаИзТаблицы(СхемаЗапроса, "ВТ_ТОВАРЫ_1",, "*", "ВТ_ТОВАРЫ",,, ОператорВыбрать);
РаботаСоСхемойЗапроса.ВыражениеПоля(ОператорВыбрать, "СУММА", "Количество");
Показать
Здесь использованы приемы, описанные в статье:
Шаблон «Выборка из временной таблицы»
Шаблон «Последовательность преобразований источника»
Шаблон "Ханойская башня".
Насколько получился компактным код можно оценить, если скопировать этот код в конструктор и получить текст запроса. Если же пойти дальше и по полученному тексту запроса сгенерировать код схемы, то можно оценить как знание приемов библиотеки позволяет сокращать код. Более того, использование при построении схемы указания неявного списка полей "*" позволяет писать универсальные алгоритмы.
30. ylyas 25 25.03.19 13:33 Сейчас в теме
Вроде бы круто... но применительно к запросом с временными таблицами на несколько экранов..
читать их в такой парадигме- просто жесть. каша из кода который сразу весь не просмотришь. и не поймешь сразу где что надо поправить... ну.. фиг знает...
31. s_vidyakin 17.04.19 21:16 Сейчас в теме
1С попыталась сделать аналог Hibernate Criteria но из-за куцего языка всё это превратилось в унылое громоздкое нечто
В JavaScript для node есть knex.js , вот это реально удобно использовать
32. MuI_I_Ika 736 07.06.19 16:22 Сейчас в теме
А условия распространения какие?
33. kalyaka 576 10.06.19 14:19 Сейчас в теме
(32) Свободные :)
Думаю в ближайшее время опубликовать на github на условиях open source, пусть это будут условия Attribution 4.0 International (CC BY 4.0)
34. sparhh 18.06.19 12:34 Сейчас в теме
Есть ли возможность добавлять через схему необязательные источники?
Имею ввиду через фигурные скобки {ЛЕВОЕ СОЕДИНЕНИЕ Документ.АвансовыйОтчет}
35. kalyaka 576 19.06.19 10:32 Сейчас в теме
(34) Можно стандартным способом, используя свойство соединения
Соединение.ОбязательноеСоединение = Ложь;

Пример кода:
	Перем СхемаЗапроса, ОператорВыбрать;
	////////////////////////////////////////////////////////////­////////////////////
	//  ЗАПРОС ПАКЕТА 0
	ЗапросПакета 	= РаботаСоСхемойЗапроса.ЗапросПакета(СхемаЗапроса,,, ОператорВыбрать, Истина);
	РаботаСоСхемойЗапроса.Источник(ОператорВыбрать, "Справочник.Валюты");
	РаботаСоСхемойЗапроса.Источник(ОператорВыбрать, "РегистрСведений.КурсыВалют.СрезПоследних", "КурсыВалютСрезПоследних");
	Соединение = РаботаСоСхемойЗапроса.Соединение(ОператорВыбрать, "Валюты", "КурсыВалютСрезПоследних", "Валюты.Ссылка = КурсыВалютСрезПоследних.Валюта", ТипСоединенияСхемыЗапроса.Внутреннее);
	РаботаСоСхемойЗапроса.Поле(ЗапросПакета, ОператорВыбрать,, "Валюты.Ссылка");
	РаботаСоСхемойЗапроса.Поле(ЗапросПакета, ОператорВыбрать,, "КурсыВалютСрезПоследних.Курс");
	
	Сообщить(СхемаЗапроса.ПолучитьТекстЗапроса());
	
//ВЫБРАТЬ
//	Валюты.Ссылка КАК Ссылка,
//	КурсыВалютСрезПоследних.Курс КАК Курс
//ИЗ
//	Справочник.Валюты КАК Валюты
//		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
//		ПО Валюты.Ссылка = КурсыВалютСрезПоследних.Валюта
	
	Соединение.ОбязательноеСоединение = Ложь;
	
	Сообщить(СхемаЗапроса.ПолучитьТекстЗапроса());
	
//ВЫБРАТЬ
//	Валюты.Ссылка КАК Ссылка,
//	КурсыВалютСрезПоследних.Курс КАК Курс
//ИЗ
//	Справочник.Валюты КАК Валюты
//		{ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних КАК КурсыВалютСрезПоследних
//		ПО Валюты.Ссылка = КурсыВалютСрезПоследних.Валюта}
Показать

Однако практического применения такому я не нашел. Дело в том, что я предполагаю, что запрос алгоритмически строится в нужном виде сразу, а используя подход СКД не нужно использовать схему, достаточно просто один раз сделать запрос в конструкторе.
36. sparhh 19.06.19 11:05 Сейчас в теме
(35) Понятно. Спасибо.
Я просто не дочитал Справку)

А практическое применение такое: доработка форм списка и журнала в типовых, доработка динамического запроса в переопределяемых модулях. Все чисто и красиво.
37. kalyaka 576 19.06.19 11:45 Сейчас в теме
(36) для доработки запроса динамического списка в формах выбора у меня есть решение Работа с данными выбора, которое базируется на использовании схемы запроса
38. skv_79 207 29.08.19 10:37 Сейчас в теме
Оставьте свое сообщение

См. также

Установка предопределенных элементов: просмотр, исправление и поиск ошибок (задвоенных и отсутствующих) Промо

Инструментарий разработчика Универсальные обработки v8 1cv8.cf Абонемент ($m)

Простая обработка для просмотра и установки значений предопределенных элементов. Позволяет заменить значение предопределенного элемента с одного элемента справочника на другой, удалить предопределенный элемент (снять пометку предопределенности), установить пометку переопределенного элемента. Проверяет предопределенные данные на наличие задвоений и отсутствующих. Работает со справочниками, планами счетов, планами видов характеристик, планами видов расчетов.

2 стартмани

06.10.2014    142300    1941    ekaruk    164    

Управление состоянием для шаблона MVC и работы с данными объекта

Работа с интерфейсом v8 1cv8.cf Абонемент ($m)

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

1 стартмани

18.03.2020    2617    2    kalyaka    33    

Конструктор мобильного клиента Simple WMS Client: способ создать полноценный ТСД без мобильной разработки. Теперь новая версия - Simple UI (обновлено 14.11.2019)

Инструментарий разработчика Сканер штрих-кода Терминал сбора данных Мобильная разработка Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Учет ОС и НМА Учет ТМЦ Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Учет ОС и НМА Учет ТМЦ v8 v8::Mobile БУ УУ Абонемент ($m)

Simple WMS Client – это визуальный конструктор мобильного клиента для терминала сбора данных(ТСД) или обычного телефона на Android. Приложение работает в онлайн режиме через интернет или WI-FI, постоянно общаясь с базой посредством http-запросов (вариант для 1С-клиента общается с 1С напрямую как обычный клиент). Можно создавать любые конфигурации мобильного клиента с помощью конструктора и обработчиков на языке 1С (НЕ мобильная платформа). Вся логика приложения и интеграции содержится в обработчиках на стороне 1С. Это очень простой способ создать и развернуть клиентскую часть для WMS системы или для любой другой конфигурации 1С (УТ, УПП, ERP, самописной) с минимумом программирования. Например, можно добавить в учетную систему адресное хранение, учет оборудования и любые другие задачи. Приложение умеет работать не только со штрих-кодами, но и с распознаванием голоса от Google. Это бесплатная и открытая система, не требующая обучения, с возможностью быстро получить результат.

5 стартмани

09.01.2019    36949    238    informa1555    200    

Работа с публикациями "Инфостарт"

Практика программирования О сообществе WEB v8 УУ Абонемент ($m)

Работа с рублевыми публикациями на сайте "Инфостарт": ведение клиентов, заказов, обновление файлов публикации, рассылка обновлений.

1 стартмани

13.09.2018    17322    12    RocKeR_13    16    

Консоль запросов с графом (Анализатор сложных запросов) Промо

Консоль запросов v8::УФ v8::Запросы 1cv8.cf Абонемент ($m)

Консоль запросов для анализа запросов с большим количеством временных таблиц и вложенных запросов. Отображает структуру взаимосвязей временных таблиц в виде графа. Позволяет быстро передвигаться по тексту запроса и получать результат выполнения подзапросов. Единственная консоль запросов, которая позволяет выводить результат выполнения вложенных запросов и любой части объединения запроса. Удобное получение данных запроса из отладчика включая временные таблицы. Текст запроса в структурированном виде (можно свернуть, развернуть текст подзапроса). И еще много другого, чего вы не найдете в других консолях запросов. Поддержка УФ и ОФ. Версия 0.9.1 от 18.10.2019 (поддержка WebKit).

10 стартмани

03.05.2017    92804    400    manuel    248    

Позиционирование в помещении с помощью нейросети по сигналу Wi-Fi. Интерактивная карта склада в 1С с показом позиции

Инструментарий разработчика Практика программирования v8 Абонемент ($m)

Данная публикация содержит в себе редактор и интерактивную карту склада или иного помещения, на которой в реальном времени отображается позиция устройства, координаты которого вычисляются по уровням сигнала нескольких роутеров Wi-Fi. В статье и приложенным к ней разработкам предлагаются инструменты и методика для реализации вычисления точной геопозиции внутри помещений с помощью нейронной сети. Конфигурация написана на релизе 1С:Предприятие 8.3.12.1412, клиентское приложение имеет минимальный уровень совместимости SDK -16.

5 стартмани

09.08.2018    24308    25    informa1555    26    

Работа с данными выбора

Практика программирования Работа с интерфейсом v8 Россия Абонемент ($m)

В управляемом интерфейсе заложена мощная возможность описывать связи реквизитов формы через параметры. Установка параметров связей позволяет ограничить выбор данных так, чтобы целостность данных была обеспечена на этапе ввода. Однако без дополнительного программирования задать можно только самые простые связи. Такие условия связи, как зависимость от реквизита через точку или зависимость через дополнительное отношение, заданное в регистре сведений - уже задать без программирования не получится.

1 стартмани

17.07.2018    37037    17    kalyaka    16    

БСП: Дополнительная обработка (Регламенты), примеры от простого к сложному

Практика программирования БСП (Библиотека стандартных подсистем) v8 1cv8.cf Абонемент ($m)

Очень много попадается странных решений, которые можно решить через БСП:Дополнительные отчеты и обработки. Я бы вообще БСП из-за этой подсистемы переименовал в «Большое Спасибо Программистам». Поработаем с подсистемой в части написания регламентных заданий.

1 стартмани

10.05.2018    39678    33    dsdred    36    

Навигатор по конфигурации базы 1С 8.3 Промо

Инструментарий разработчика Универсальные обработки v8 v8::УФ 1cv8.cf Россия Абонемент ($m)

Универсальная внешняя обработка для просмотра метаданных конфигураций баз 1С 8.3. Отображает свойства и реквизиты объектов конфигурации, их количество, основные права доступа и т.д. Отображаемые характеристики объектов: свойства, реквизиты, стандартные рекизиты, реквизиты табличных частей, предопределенные данные, регистраторы для регистров, движения для документов, команды, чужие команды, подписки на события, подсистемы. Отображает структуру хранения объектов базы данных, для регистров доступен сервис "Управление итогами". Платформа 8.3, управляемые формы. Версия 1.1.0.59 от 07.05.2020

3 стартмани

28.10.2018    28086    268    ROL32    67    

Как выполнить отчет на СКД через COM и получить данные отчета?

Практика программирования v8 УПП1 Россия Абонемент ($m)

Для чего это нужно. Например, нужно в одной базе получить какой-либо показатель из другой базы. Этот показатель вычисляется в каком-либо сложном отчете, который написан на СКД. Можно, конечно, "скопипастить" текст запроса из другой базы, немного подправить его и выполнять в том же COM подключении. Но с этим теряется гибкость: если отчет изменился, то нужно помнить о том, что где-то есть его "немного модифицированная" копия. В статье будет рассмотрен пример получения данных из базы ЗУП.

2 стартмани

08.05.2018    24572    8    wowik    3    

Регистры правил [Расширение]

Инструментарий разработчика Информационная безопасность v8 v8::Права УТ11 Абонемент ($m)

Регистры правил - права доступа, запрет редактирования, автоподстановка реквизитов и т.д.

10 стартмани

15.03.2018    15638    7    33lab    1    

Заполняем по шаблону (по умолчанию)

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

Простой в подключении, универсальный и достаточно удобный механизм заполнения реквизитов произвольных документов/справочников значениями по умолчанию. Реализован в расширении, но может быть и непосредственно включен практически в любую конфигурацию на управляемых формах простым копированием одной формы и двух команд. Весь код в статье.

1 стартмани

08.02.2018    24239    19    mvxyz    17    

[Расширение] Контроль отрицательных остатков по регистру бухгалтерии при проведении Промо

Универсальные функции Инструментарий разработчика Учет ТМЦ Учет ТМЦ v8 1cv8.cf Россия БУ Абонемент ($m)

Расширение позволяет без изменений конфигурации проверять остатки по регистру бухгалтерии при проведении каждого документа и запрещает проведение при появлении отрицательных остатков после проведения.

1 стартмани

17.08.2015    44224    155    ekaruk    31    

Бесплатная проверка контрагентов в ФНС (общий модуль с алгоритмом). На примере выводим статус в список справочника контрагентов

Практика программирования v8 1cv8.cf Абонемент ($m)

Если вам интересно проверить контрагенте в ФНС, вам поможет данная публикация. Весь алгоритм работы строится на основе данных, полученных с сервиса http://npchk.nalog.ru совершенно бесплатно.

1 стартмани

01.02.2018    32143    54    rpgshnik    48    

Расширение возможностей печати: Вывод произвольного нижнего и верхнего колонтитула

Печатные формы документов Практика программирования Универсальные функции v8 1cv8.cf Абонемент ($m)

Расширяем функционал вывода нижнего / верхнего колонтитула. Стандартно 1С имеет достаточно ограничений по выводу и наполнению колонтитулов содержимым, взять хотя бы такие, как вывод только текста и отсутствие ограничения на номер конечной страницы. А при разработке кода сталкиваешься с тем, что свой блок с нижним колонтитулом нужно прижимать к низу страницы. Казалось бы быстро решаемый вопрос, но и в нем есть нюансы. Сейчас я расскажу о том, как решалась эта задача. UPD 15.02.2018. Добавлен вывод верхнего колонтитула; Вывод колонтитулов на первой и последней странице управляется параметрами; Научился считать страницы: Добавлено заполнение переменных аналогичных стандартным из колонтитулов; Задаются форматы даты и времени. Ограничения прежние: 1. Повторно сформировать табличный документ после смены параметров страницы интерактивно.; 2. Передавать данные для более плотной печати как можно более мелко нарезанными кусками.

1 стартмани

29.12.2017    34685    27    agent00mouse    0    

Печатная форма, сделанная как расширение конфигурации для БП 3.0. Новые возможности БСП

Практика программирования Универсальные печатные формы v8 БП3.0 Абонемент ($m)

Печатные формы на внешних обработках скоро канут в лету. На смену им приходят ПФ, реализованные в виде расширений конфигурации. Не нашел на сайте примеров таких расширений. Привожу пример подобного расширения для БП 3.0.

1 стартмани

06.12.2017    24054    49    kwazi    6    

Безопасная работа с транзакциями во встроенном языке Промо

Практика программирования v8 1cv8.cf Абонемент ($m)

Разбираемся с опасностями использования транзакций во встроенном языке 1С. Познаем ошибку "В данной транзакции уже происходили ошибки". Учимся защищаться от них.

1 стартмани

25.03.2019    28551    9    tormozit    44    

Программное формирование форматированной строки в стиле html+inline CSS

Работа с интерфейсом Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

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

1 стартмани

18.11.2017    27394    30    bonv    9    

Расширения конфигураций 1С: учимся перехватывать методы

Практика программирования v8 v8::УФ 1cv8.cf Абонемент ($m)

В этой статье я на примерах разберу некоторые механизмы расширений конфигураций 1С. А именно «перехваты» методов модуля объекта и «перехваты» событий формы и элементов формы. Данная статья написана с учебными целями, чтобы показать, как при помощи расширений конфигурации можно делать такие доработки, ради которых раньше приходилось снимать конфигурацию с поддержки.

1 стартмани

30.05.2017    111967    13    signum2009    45    

Многопоточность. Универсальный «Менеджер потоков» (фреймворк) с отслеживанием зависимости объектов

Практика программирования Математика и алгоритмы Универсальные функции Производительность и оптимизация (HighLoad) v8 1cv8.cf Россия Абонемент ($m)

Восстановление партий, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

26.05.2017    46072    15    DarkAn    86    

Faster - многофункциональный ускоритель работы программиста 1С Промо

Инструментарий разработчика v8 1cv8.cf Россия Абонемент ($m)

Программа Faster 8.7 позволяет ускорить процесс работы программиста 1С (и не только 1C). Программа Faster позволяет делится кодом с другими программистами в два клика или передать ссылку через QR Код. Исправление введенных фраз двойным Shift (с помощью speller.yandex) Полезная утилита для тех, кто печатает много однотипного текста, кодирует в среде Windows на разных языках программирования. Через некоторое время работы с программой у вас соберется своя база часто используемых словосочетаний и кусков кода. Полностью переделан механизм перехвата клавиш, теперь не зависает при обработке скриптов.

1 стартмани

24.05.2012    74877    206    moolex    145    

Набор подсистем "Умные таблицы"

Инструментарий разработчика v8 Беларусь Россия Казахстан Абонемент ($m)

Данный набор подсистем – прикладная библиотека, призванная помочь программисту 1С быстрее решать ряд типовых задач бизнес-логики, таких как: ведение статусов объектов, отправка почтовых сообщений в определенное время, ведение произвольных таблиц с возможностью редактирования, сохранения и группировки, ориентированные на расчет бюджетных таблиц (план продаж, ретробонусы B2C, проценты по договорам B2B и договорные условия по КАМ), расчет коммерческой политики для бюджетных таблиц, исполнение произвольных алгоритмов с хранением кода в информационной базе, определение рабочих баз, хранение файлов во внешних СУБД (Postgre SQL, MS SQL и MongoDB) и выполнение произвольного кода после изменений ссылочного объекта вне транзакции изменения.

1 стартмани

22.05.2017    30373    94    Silenser    33    

Простой способ индексирования интервалов

Практика программирования v8 Абонемент ($m)

Предлагается простой способ индексирования интервалов для решения задач выборки записей, включающих заданный момент времени, пересекающихся с заданным интервалом или множеством интервалов. Способ основан на добавлении к исходной таблице особого числового индексированного поля, рассчитываемого по специальной формуле. Приведен код функций, необходимых для расчетов поля поиска и параметров поисковых запросов. Приведены также результаты тестирования метода, доказывающие его высокую эффективность.

1 стартмани

28.09.2016    37494    38    ildarovich    22    

Конструктор-тестер http запросов в 1С

WEB Инструментарий разработчика v8 1cv8.cf Россия Абонемент ($m)

Данная обработка позволяет в несколько кликов конструировать http запросы на языке 1С и просматривать результаты их выполнения.

3 стартмани

19.08.2016    39239    294    hlopik    17    

Модель объекта Промо

Инструментарий разработчика v8 Абонемент ($m)

Подсистема позволяет описать модель данных объекта, где описана зависимость между реквизитами, и затем использовать эту модель в разных сценариях работы с объектом. Версия платформы: 8.3.6 и выше. С небольшими доработками будет работать на 8.2.

1 стартмани

30.06.2019    10155    0    vadim1980    5    

1С: Предприятие + корпоративный чат, как наладить оперативные уведомления за 10 минут

Практика программирования v8 Абонемент ($m)

Как сделать автоматические уведомления о разных событиях из 1С в корпоративный чат MyChat для сотрудников компании

1 стартмани

14.08.2016    43948    36    Demanoidos    60    

Hello world на metadata.js

Инструментарий разработчика WEB Мобильная разработка v8 1cv8.cf Абонемент ($m)

Про браузерные offline-first приложения можно написать миллионы слов. Сэкономлю своё и ваше время и перейду сразу к делу. В статье не будет рекламы и агитации за новые технологии, не будет критики традиционных или попсовых решений. Рассмотрим по шагам разработку простейшей программы на metadata.js. Постараюсь сделать акцент не на том «как это сделано», а «почему сделано именно так»

1 стартмани

11.08.2016    54281    111    unpete    208    

Подсистема обмена данными с порталом ИМНС по электронным счетам-фактурам (автоматический обмен)

Внешние источники данных WEB Инструментарий разработчика v8 1cv8.cf Беларусь БУ НДС Абонемент ($m)

Подсистема включает документы и обработки для автоматического обмена данными с порталом ИМНС через web-сервис. Присутствует возможность заполнения данными типовых операций за период, учёта входящих документов, учёта произвольных исходящих документов. Приложены обработки для запуска задания планировщика на автоматический обмен данными.

1 стартмани

28.07.2016    30746    19    c1nil    4    

Вам нравятся запросы в 1С? Промо

Практика программирования Разработка v8 v8::Запросы 1cv8.cf Абонемент ($m)

Речь не только о том, что простейший запрос с "легальным" оформлением растянется на пол-экрана, речь еще обо всем, что нужно написать "в нагрузку" к тексту запроса. Все эти "Новый Запрос", "УстановитьПараметр" и последующие пляски с обработкой результата... Пора с этим заканчивать!

1 стартмани

03.07.2019    16565    4    m-rv    86    

Навигатор по структуре и данным баз 1С 8

Инструментарий разработчика v8 v8::УФ 1cv8.cf Абонемент ($m)

Просмотр структуры и данных информационных баз 1С:Предприятие 8.2, 8.3. Состав, типы объектов, табличных частей, движений. Размер, структура хранения объекта. Для администраторов и разработчиков. Версия 1 - на обычных формах, версия 2 - на управляемых.

1 стартмани

11.07.2016    26695    127    o.nikolaev    17    

Хранение файлов в томах на диске (для УПП 1.3)

Практика программирования v8 УПП1 Абонемент ($m)

Доработка типовой УПП 1.3 в плане хранения присоединенных файлов вне базы данных

2 стартмани

05.06.2016    51969    7    wowik    29    

Остатки на каждый день в запросе

Практика программирования Учет ТМЦ Учет ТМЦ v8 1cv8.cf УУ Абонемент ($m)

Запрос формирует остатки товаров на каждый день в пределах выбранного периода.

1 стартмани

26.04.2016    49434    19    arakelyan    18    

Консоль запросов + ТЗ как параметры Промо

Консоль запросов v8 1cv8.cf Украина Абонемент ($m)

Стандартная консоль запросов, с добавленной возможностью использования описания/заполнения/использования таблиц значений как параметров. Совместима с настройками базовой консоли. Упрощает отладку запросов, использующих временные таблицы.

2 стартмани

12.11.2010    31803    58    Kashemir    24    

Консоль запросов "Запросник" для управляемых форм с подсветкой синтаксиса

Консоль запросов v8 1cv8.cf Абонемент ($m)

Вот уже много лет я использую замечательный инструмент для работы с запросами - Запросник. Однако, с переходом на управляемые формы для его использования пришлось запускать базы в устаревшем толстом клиенте, да еще и разрешать в свойствах конфигурации использование обычных форм. В 2014 году появился запросник на управляемых формах, который, к сожалению, оказался несовершенен из за ограничений платформы. Самое неприятное из них - отсутствие подсветки синтаксиса. Мне кажется, что я нашел решение этой проблемы.

1 стартмани

19.04.2016    34719    254    1С_Мастер    42    

Выполнение JavaScript кода из 1С в объекте Поле HTML Документа (HTML 5) и вызов события в 1С ПриНажатии

Практика программирования v8 1cv8.cf Россия Абонемент ($m)

Пример выполнения JS кода из 1С в Поле HTML Документа под управляемыми формами, с удобным получением результата в 1С(С помощью вызова привязанного события ПриНажатии к элементу ПолеHTMLДокумента)

1 стартмани

22.03.2016    72643    146    igo1    51    

Количество дней недели (понедельников/вторников/...) в заданном диапазоне одним запросом

Практика программирования v8 Абонемент ($m)

При реализации периодического авто-заполнения маршрутных листов по графику (недельному) необходимо было просчитать стоимость всего периода, с условием выездов только по определенным дням. Заморачиваться с обходом результата не хотелось. Пришлось написать "Небольшой" запрос.

1 стартмани

03.03.2016    15966    1    Alexander.Shvets    5    

[x1c.ru] 1CDBin: Работа с файлами *.1CD на низком уровне средствами языка 1С с возможностью чтения таблиц (поддерживается формат 8.3.8.0) Промо

Тестирование и исправление Инструментарий разработчика v8 1cv8.cf Абонемент ($m)

Обработка позволяет просматривать файловые базы 1CD на низком уровне средствами встроенного языка. Реализована часть функциональности Tool_1CD, но на языке 1С Предприятия. Показываются таблицы, параметры таблиц, поля таблиц, записи таблиц, значения полей BLOB, есть 16-ричный просмотр страниц базы и консоль кода. Можно использовать для изучения структуры файлов 1CD, просмотра баз 1CD для выявления повреждений, создания своих обработок для выгрузки данных без открытия исследуемой базы в 1С:Предприятии.

1 стартмани

07.10.2014    48120    197    GusevNA    75    

Простые радости жизни программиста 1С: выбор типа значения

Работа с интерфейсом Практика программирования v8 1cv8.cf Абонемент ($m)

Предлагаемая в работе обработка включает обычную и управляемую формы, которые максимально точно реализуют функциональность системного диалога выбора типа в толстом клиенте обычное приложение (включая оформление диалога). Эти формы имеют дополнительные интерфейсные удобства и могут быть использованы в качестве альтернативных диалогов выбора типа.

1 стартмани

17.02.2016    45089    47    yuraos    17    

Яндекс.Деньги "Благотворительность"

Инструментарий разработчика Практика программирования v8 1cv8.cf Абонемент ($m)

Яндекс.Деньги теперь в 1С. Форма для приема благотворительных взносов. Форму легко сделать и вставить на любую страницу сайта или блога. Платежи будут приходить на ваш кошелек. На форме есть три способа платежа: из кошелька, с банковской карты, с баланса мобильного.

1 стартмани

16.02.2016    21114    8    Tatitutu    5    

Мастер рассылки e-mail 2.2 для управляемых форм

Практика программирования Email v8 v8::УФ ERP2 БП3.0 УТ11 Абонемент ($m)

Для пользователей: переделанный из старый разработки под 8.2 с использованием библиотеки Мастер рассылки e-mail 2.2 (ERP, УТ, БП) (Только управляемые формы), который теперь может запускаться под любой версией платформы с разрешенными или запрещенными модальными/синхронными вызовами в конфигурации. Также удобный выбор e-mail и их владельцев с помощью отбора динамического списка по любым критериям и галочки исключения.

1 стартмани

29.12.2015    34991    19    milkers    4    

ВСТАВИТЬ В Справочник.Номенклатура (Код, Наименование) ЗНАЧЕНИЯ ("001", "Новый товар") Промо

Практика программирования v8 v8::Запросы 1cv8.cf Абонемент ($m)

Вас не обманывают ваши глаза, это запрос на изменение данных! И это работает без прямого доступа к БД, регистрации и смс.

1 стартмани

01.06.2018    26738    86    m-rv    57    

Нечеткий поиск одним запросом

Практика программирования v8 1cv8.cf Абонемент ($m)

Использование механизма полнотекстового поиска в 1С не всегда оправдано, т.к. построение индекса и поддержание его в актуальном состоянии может значительно нагружать систему. Предлагаемая реализация нечеткого поиска методом N-грамм выполняется одним запросом, что позволяет производить поиск в любой таблице и не требует предварительного построения индекса.

1 стартмани

28.12.2015    23896    61    vasvl123    9    

Передача больших пакетов через веб-сервисы

Практика программирования Администрирование данных 1С Внешние источники данных v8 Абонемент ($m)

Реализация механизма передачи больших пакетов через веб-сервисы. С его помощью передать файл размером в несколько гигабайт не составит проблем.

1 стартмани

06.12.2015    52054    47    YPermitin    19    

Интерфейс сопоставления объектов для обмена (для типового регистра СоответствиеОбъектовДляОбмена)

Инструментарий разработчика Универсальные обработки Перенос данных из 1C8 в 1C8 v8 КА1 БП2.0 ЗУП2.5 УТ10 УПП1 Абонемент ($m)

Вы внедряете обмен данными между двумя типовыми или основанными на типовых БД и вам необходим инструмент, чтобы сопоставить между собой справочники этих конфигураций? Вы хотите навести порядок в обмене данными, потому что вам надоело вылавливать дублирующиеся объекты? Вам очень хочется перепоручить сопоставление объектов обменивающихся баз пользователям, но нет подходящего и понятного пользователям интерфейса? Тогда вам нужна именно эта обработка!

4 стартмани

11.11.2015    36015    131    catsam    8    

Редактор объектов информационной базы 8.3 Промо

Инструментарий разработчика Универсальные обработки v8 v8::УФ 1cv8.cf Россия Абонемент ($m)

Универсальная внешняя обработка для редактирования реквизитов и табличных частей объектов информационной базы, редактирование движений документов. Доступ ко всем реквизитам объектов, есть возможность выгрузки и загрузки данных (объекты и движения документов) через XML. Платформа 8.3, управляемые формы. Версия 1.1.0.45 от 01.05.2020

2 стартмани

23.01.2019    22380    245    ROL32    33    

Exec - Выполнение кода, консоль запросов и не только!

Консоль запросов v8 1cv8.cf Абонемент ($m)

Незаменимый инструмент администратора БД и программиста: Выполняйте произвольный код из режима 1С Предприятие; сохраняйте/загружайте часто используемые скрипты; выполняйте запросы с замером производительности запроса в целом и каждой из временных таблиц в частности, а также с просмотром содержимого временных таблиц; произвольным образом изменяйте любые объекты БД, редактируя даже не вынесенные на формы реквизиты и записывая изменения в режиме "ОбменДанными.Загрузка = Истина"; легко узнавайте ИД объектов БД; выполняйте прямые запросы к SQL с замером производительности и не только!

5 стартмани

10.11.2015    38640    75    catsam    11    

Быстрое определение интервалов в запросе

Практика программирования v8 Абонемент ($m)

В статье описывается новый метод определения интервалов между данными различных записей в запросе. В отличие от общеизвестного метода, время работы предлагаемого метода зависит от объема данных ЛИНЕЙНО. Это обеспечивает ему значительный выигрыш по быстродействию на больших объемах данных. В качестве иллюстрации возможностей метода приведен отчет, показывающий гистограмму распределения времени между продажами.

1 стартмани

01.10.2015    46983    32    ildarovich    41    

Полезные приемы при работе с Excel из 1С (Версия 3.1)

Практика программирования Разработка внешних компонент Загрузка и выгрузка в Excel v8 1cv8.cf Абонемент ($m)

Программисту 1С часто приходится работать с таблицами Excel из 1С. Я постарался собрать небольшой FAQ и набор функций для работы с файлами Excel. Надеюсь, кому-то будет полезна данная статья.

1 стартмани

22.09.2015    172868    424    Zerocl    65    

Консоль запросов для УФ универсальная 8.3.7.3 Промо

Консоль запросов v8::УФ v8::Запросы 1cv8.cf Абонемент ($m)

Реализован программный вызов консоли для захвата "рваного" запроса, МВТ и параметров. В консоли реализована полная поддержка работы с таблицами значений. Выборочный просмотр пакетов и временных таблиц. Возможность выборочной выгрузки пакета запроса в ТЗ, с последующим её редактированием, сохранением на диск. Использование сохранённой ТЗ в качестве параметра для других запросов. Возможность обхода ТЗ в цикле с выполнением кода. Отсутствуют ошибки при наличии уничтожения временных таблиц. Замер времени выполнения каждого пакета запроса. Приличное окно настройки типа (только для параметров запроса), лёгкое преобразование в список значений и обратно. Поддержка дополнительных типов: ТЗ, Граница, Момент времени, Вид счёта, Вид движения и т.д. Форматирование типа значения при выводе запроса (NULL, пустая ссылка, пустая строка и т.п.). Наверное, самый лучший подбор ширины колонок. Возможность добавлять листы для вывода результатов запросов. Генерируется текст для конфигуратора с учётом количества результирующих пакетов, для каждого пакета можно настроить выборку или выгрузку и пересоздать текст.... Короче, лучше один раз увидеть ...

5 стартмани

12.03.2015    138711    3399    akor77    715    

Code First и Linq to EF на примере 1С версии 7.7 и 8.3 часть I

Практика программирования v8 Абонемент ($m)

Данный проект является чисто исследовательским примером использования Code First и Linq to EF на примере 1С версии 7.7. Так как сам я программист 1С, то мне всегда было интересно, как можно перенести модель объектов 1С на компилируемые языки, и использовать мощь Linq to EF. С появлением Code First давно хотел прикрутить, но все как-то руки не доходили, и вот, наконец ..

1 стартмани

28.08.2015    20974    3    Serginio    2    

Работа с push сервисами только средствами 1С 8.2

Сервисные утилиты Инструментарий разработчика Универсальные обработки v8 Абонемент ($m)

Обработка для настройки, тестирования и использования с предустановками для 3-х сервисов. Текст модуля для внедрения в конфигурацию или другие обработки. Уведомления на телефон, компьютер, браузер.

1 стартмани

18.08.2015    28574    43    anig99    1    

Универсальная учетная система с конструктором документов и справочников в режиме 1С: Предприятие

Инструментарий разработчика Практика программирования v8 1cv8.cf УУ Абонемент ($m)

Заголовок статьи звучит фантастично, но это не шутка. Занимаясь внедрениями, я часто сталкивался с ситуацией, когда надо было к типовой конфе приделать простенький модуль учета чего-нибудь, не специфичного для самой конфы. Например в УТ учет материалов в эксплуатации. Модуль обычно состоял из пары справочников (2-3), 3-х документов и регистра или пары регистров. Однажды подобные пристройки понадобились одновременно на 3 проектах. Скучно делать одинаковую работу, и я подумал, а что, если сделать универсальный инструмент, в котором пользователь сам сможет нарисовать себе справочники, реквизиты к ним, документы и движения. Т.е. конструктор полноценных документов в пользовательском режиме. Это оказалось не так сложно - все дело в подходящей архитектуре данных.

1 стартмани

29.07.2015    29625    87    informa1555    41    

Конвертация данных. Найдется все! И еще немного...

Поиск данных Инструментарий разработчика v8 КД Абонемент ($m)

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

2 стартмани

25.06.2015    26258    32    tomvlad    7