Объектная модель запроса "Схема запроса" - теория и примеры использования

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

Разработка - Практика программирования

схема запроса объектная модель запроса запрос модификация запроса

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

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

Попробуем разобраться, что такое вообще запрос. В каком формате он представлен в 1С и на сервере ИБ.

Упрощенно можно выделить следующие уровни работы с запросом:
1. Запрос на языке СУБД. На этом уровне запрос представляет собой текстовую строку в синтаксисе конкретной СУБД.
Например "SELECT field1 FROM table1 WHERE table1.field2 > 100".
2. Драйвер конкретной СУБД. Это утилита, которая служит связующим звеном между программой и сервером. Она получает запрос от программы и передает его к СУБД.
На этом уровне 1С работает с внешними источниками данных.
3. Универсальный программный интерфейс. Это универсальный компонент, позволяющий программе получить доступ к данным в различных ИБ. Его также можно назвать менеджером драйверов. К нему в виде DSN подключаются используемые на компьютере драйвера конкретных СУБД. В зависимости от используемой системы тут может быть компонент ODBC, OLE DB, JDBC, ADO.NET либо любого другого стандарта. Судя по http://its.1c.ru/db/metod8dev#content:2926:1 на текущий момент 1С использует OLE DB. В платформе 7.7 использовался ODBC.
4. Объект на сервере 1С. На этом уровне выполняется работа сервера приложений с запросом.
Насколько я понимаю, в платформе на языке Си описан объект запроса для которого прописаны методы формирования текста SQL. С этим объектом запроса работают платформенные объекты (конструктор запросов, построитель и т.д.)
5. Запрос на языке 1С. На этом уровне запрос представляет из себя текст, написанный на псевдо-SQL-языке вида "ВЫБРАТЬ Справочник.ИмяСправочника.ИмяПоля ИЗ Справочник.ИмяСправочника"

Насколько я понимаю, с введением объекта "Схема запроса" ничего нового в платформе не изобрели.
Ранее мы могли работать только с текстовым представлением запроса (уровень 5). Это наиболее простой и понятный способ, хотя и не всегда удобный.
Сейчас нам дали доступ к объекту (уровень 4), с которыми ранее работали только платформенные механизмы.
Если проанализировать объект "Схема запросов", то его свойства очень четко пересекаются с конструктором запросов.
Каждому элементу и свойству можно найти визуальный аналог в конструкторе запросов.
Каждому клику в конструкторе можно подобрать аналогичную команду.
Например:
Закладка "Пакет запросов" = СхемаЗапроса.ПакетЗапросов;
Закладка "Таблицы и поля" = СхемаЗапроса.ПакетЗапросов[0].ДоступныеТаблицы;
Клик на таблице "Справочники" - "Номенклатура" = СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники.Добавить("Справочник.Номенклатура");

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

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

СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
//Тут наши комманды модификации запроса
Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();

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

Чтобы понять общую структуру схемы запроса открываем нужный раздел СП и загоняем все связи между объектами в графопостроитель.
Получается такой вот граф.
Не могу сказать, что он очень понятный, но общую идею отображает. Удобно подглядывать при анализе запроса.
В графе обозначены:
Желтым - объектные сущности схемы запроса;
Красным - коллекции объектов;
Зеленым - стандартные типы 1С (строка, число, булево);
Бирюзовым - примитивные типы, специфичные для схемы запроса;

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

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

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

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

ВЫБРАТЬ РАЗЛИЧНЫЕ ПЕРВЫЕ 100
	Товары.Ссылка,
	Продажи.Период,
	0,
	ЕСТЬNULL(Продажи.СуммаОборот, 0)
ИЗ
	Справочник.Номенклатура КАК Товары
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты(&Начало, &Окончание, Месяц) КАК Продажи
		ПО Продажи.Номенклатура = Товары.Ссылка
ГДЕ
	НЕ Товары.ЭтоГруппа

ИНДЕКСИРОВАТЬ ПО
	Номенклатура,
	Период
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	ТаблицаОбороты.Номенклатура КАК Номенклатура,
	ТаблицаОбороты.Период КАК Период,
	СУММА(ТаблицаОбороты.СуммаЗакупок) КАК СуммаЗакупок,
	СУММА(ТаблицаОбороты.СуммаПродаж) КАК СуммаПродаж
ИЗ
	ТаблицаОбороты КАК ТаблицаОбороты

СГРУППИРОВАТЬ ПО
	ТаблицаОбороты.Номенклатура,
	ТаблицаОбороты.Период

ИМЕЮЩИЕ
	СУММА(ТаблицаОбороты.СуммаЗакупок) > 0

УПОРЯДОЧИТЬ ПО
	ТаблицаОбороты.Номенклатура.Наименование,
	Период
ИТОГИ
	СУММА(СуммаЗакупок),
	СУММА(СуммаПродаж)
ПО
	ОБЩИЕ,
	Номенклатура ТОЛЬКО ИЕРАРХИЯ
;

////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ТаблицаОбороты

Проанализируем пакет запросов.

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

Начнем программное создание пакета запросов.

Для разработки кода воспользуемся деревом запроса. По нему удобно определять пути к данным. Желательно периодически проверять получившийся текст запроса после модификаций кода.

Для начала создадим объект "СхемаЗапроса".

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

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

ЗапросВыбораИзИБ = СхемаЗапроса.ПакетЗапросов[0];
ОператорВыбораЗакупок = ЗапросВыбораИзИБ.Операторы[0];

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

ИсточникНоменклатура = ОператорВыбораЗакупок.Источники.Добавить("Справочник.Номенклатура","Товары");
ИсточникЗакупки = ОператорВыбораЗакупок.Источники.Добавить("РегистрНакопления.Закупки.Обороты","Закупки");

По умолчанию второй источник добавляется с левым соединение к первому. 

Нам нужно обратное сединение. Меняем тип соединения.

ИсточникЗакупки.Соединения[0].ТипСоединения = ТипСоединенияСхемыЗапроса.ПравоеВнешнее;

Параметры таблиц:
Для каждой добавленной в качестве источника таблицы мы можем задать дополнительные параметры.
Коллекция параметров заполняется автоматически при добавлении таблицы в зависимости от типа таблицы.
Добавить в неё параметр вручную нельзя, можно лишь установить значение имеющегося параметра.
Таблица "Справочник.Номенклатура" это простая таблица справочника. У нее параметров нет.
Таблица "РегистрНакопления.Закупки.Обороты" это таблица оборотов регистра накопления.
Согласно СП, у неё есть 4 параметра: начало периода, конец периода, периодичность, условие.
Нам необходимо установить первые 3 параметра:

ИсточникЗакупки.Источник.Параметры[0].Выражение = Новый ВыражениеСхемыЗапроса("&Начало") ;
ИсточникЗакупки.Источник.Параметры[1].Выражение = Новый ВыражениеСхемыЗапроса("&Окончание") ;
ИсточникЗакупки.Источник.Параметры[2].Выражение = Новый ВыражениеСхемыЗапроса("Месяц") ;

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

ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("Товары.Ссылка");
ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("Закупки.Период");
ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("ЕСТЬNULL(Закупки.СуммаОборот, 0)");
ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("0");

Укажем на уровне запроса вцелом псевдонимы для выбираемых колонок:
Обратите внимание, что колонки таблиц выбираем для каждого подзапроса объединения, имена колонкам присваиваем вцелом для коллекции "Колонки" на уровне запроса пакета.

ЗапросВыбораИзВТ.Колонки[0].Псевдоним = "Номенклатура";
ЗапросВыбораИзВТ.Колонки[1].Псевдоним = "Период";
ЗапросВыбораИзВТ.Колонки[2].Псевдоним = "СуммаЗакупок";
ЗапросВыбораИзВТ.Колонки[3].Псевдоним = "СуммаПродаж";

Добавим условие на выбор данных

ОператорВыбораПродаж.Отбор.Добавить("НЕ Товары.ЭтоГруппа");

Всё аналогично добавляем для второй части запроса.

Сопоставление колонок:
У нас в каждом операторе выбора выбирается 4 поля (элемент справочника "Номенклатура", дата и два числовых поля).
При объединении колонок из двух операторов выбора колонки из справочника и даты система соспоставит сама.
Числовых колонок две. Схема может самостоятельно сопоставить их с колонками первого запроса неверно.
Указываем, какой колонке таблицы результата какое выражение соответствует.

ЗапросВыбораИзИБ.Колонки[2].Поля.Установить(1,ВыражениеЗакупки);
ЗапросВыбораИзИБ.Колонки[3].Поля.Установить(1,ВыражениеПродажи);

Все аналогично повторяем для второго запроса пакета.

Из отличий, тут используется отбор по итоговым значения вида "ИМЕЮЩИЕ".
Такое условие добавляется аналогично обычному отбору на детальные записи.
Схема сама определит, в какой раздел условий поместить наше в зависимости от использования функций группировки.

ОператорВыбрать.Отбор.Добавить("СУММА(ТаблицаОбороты.СуммаЗакупок) > 0");

Последним шагом добавляем запрос на уничтожение таблицы данных

ЗапросУничтоженияВТ = СхемаЗапроса.ПакетЗапросов.Добавить(Тип("ЗапросУничтоженияТаблицыСхемыЗапроса"));
ЗапросУничтоженияВТ.ИмяТаблицы = "ТаблицаОбороты";

А также выставляем дополнительные свойства запросов:

ЗапросВыбораИзИБ.ТаблицаДляПомещения = "ТаблицаОбороты";
ЗапросВыбораИзИБ.ВыбиратьРазрешенные = Истина;

Итоговый полный вариант формирования запроса:

//Создание схемы запроса
СхемаЗапроса = Новый СхемаЗапроса;
ЗапросВыбораИзИБ = СхемаЗапроса.ПакетЗапросов[0];
//Установка свойств запроса
ЗапросВыбораИзИБ.ТаблицаДляПомещения = "ТаблицаОбороты";
ЗапросВыбораИзИБ.ВыбиратьРазрешенные = Истина;
//Добавляем операторы выбора первого запроса пакета
ОператорВыбораЗакупок = ЗапросВыбораИзИБ.Операторы[0];
ИсточникНоменклатура = ОператорВыбораЗакупок.Источники.Добавить("Справочник.Номенклатура","Товары");
//Добавляем запрос выбора из регистра закупок
ИсточникЗакупки = ОператорВыбораЗакупок.Источники.Добавить("РегистрНакопления.Закупки.Обороты","Закупки");
ИсточникЗакупки.Источник.Параметры[0].Выражение = Новый ВыражениеСхемыЗапроса("&Начало") ;
ИсточникЗакупки.Источник.Параметры[1].Выражение = Новый ВыражениеСхемыЗапроса("&Окончание") ;
ИсточникЗакупки.Источник.Параметры[2].Выражение = Новый ВыражениеСхемыЗапроса("Месяц") ;
//Меняем тип соединения
ИсточникЗакупки.Соединения[0].ТипСоединения = ТипСоединенияСхемыЗапроса.ПравоеВнешнее;
//Указываем выбираемые поля
ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("Товары.Ссылка");
ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("Закупки.Период");
ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("ЕСТЬNULL(Закупки.СуммаОборот, 0)");
ОператорВыбораЗакупок.ВыбираемыеПоля.Добавить("0");
//Указываем спевдонимы для выбранных полей
ЗапросВыбораИзИБ.Колонки[0].Псевдоним = "Номенклатура";
ЗапросВыбораИзИБ.Колонки[1].Псевдоним = "Период";
ЗапросВыбораИзИБ.Колонки[2].Псевдоним = "СуммаЗакупок";
ЗапросВыбораИзИБ.Колонки[3].Псевдоним = "СуммаПродаж";
//Добавляем отбор
ОператорВыбораЗакупок.Отбор.Добавить("НЕ Товары.ЭтоГруппа");

///////////////////////
//Выбираем данные о продажах
ОператорВыбораПродаж = ЗапросВыбораИзИБ.Операторы.Добавить();
ИсточникНоменклатура = ОператорВыбораПродаж.Источники.Добавить("Справочник.Номенклатура","Товары");
ОператорВыбораПродаж.ВыбираемыеПоля.Добавить("Товары.Ссылка");
//Добавляем источник РН и устанавливаем параметры
ИсточникПродажи =ОператорВыбораПродаж.Источники.Добавить("РегистрНакопления.Продажи.Обороты","Продажи");
ИсточникПродажи.Источник.Параметры[0].Выражение = Новый ВыражениеСхемыЗапроса("&Начало") ;
ИсточникПродажи.Источник.Параметры[1].Выражение = Новый ВыражениеСхемыЗапроса("&Окончание") ;
ИсточникПродажи.Источник.Параметры[2].Выражение = Новый ВыражениеСхемыЗапроса("Месяц") ;
ИсточникПродажи.Соединения[0].ТипСоединения = ТипСоединенияСхемыЗапроса.ПравоеВнешнее;
//Указываем отбираемые поля и устанавливаем для числовых полей соответствие с полями первого запроса
ОператорВыбораПродаж.ВыбираемыеПоля.Добавить("Продажи.Период");
ВыражениеЗакупки = ОператорВыбораПродаж.ВыбираемыеПоля.Добавить("0");
ВыражениеПродажи = ОператорВыбораПродаж.ВыбираемыеПоля.Добавить("ЕСТЬNULL(Продажи.СуммаОборот, 0)");
ЗапросВыбораИзИБ.Колонки[2].Поля.Установить(1,ВыражениеЗакупки);
ЗапросВыбораИзИБ.Колонки[3].Поля.Установить(1,ВыражениеПродажи);
//Добавляем отбор
ОператорВыбораПродаж.Отбор.Добавить("НЕ Товары.ЭтоГруппа");
//Индексируем данные
ЗапросВыбораИзИБ.Индекс.Добавить(ЗапросВыбораИзИБ.Колонки[0]);
ЗапросВыбораИзИБ.Индекс.Добавить(ЗапросВыбораИзИБ.Колонки[1]);
//Устанавливаем параметры выбора данных
ОператорВыбораПродаж.ВыбиратьРазличные = Истина;
ОператорВыбораПродаж.КоличествоПолучаемыхЗаписей = 100;


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

Выполнив этот набор команд мы получаем тот же запрос, который ранее получили конструктором.

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

Плюшки появляются только в случае, если нам необходимо этот запрос модифицировать дальше в зависимости от настроек.
Рассмотрим несколько примеров модификация нашего пакета из 3х запросов:

Пример 1.

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

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

Если ЗначениеЗаполнено(Организация) Тогда
ОператорВыбораЗакупок.Отбор.Добавить("Закупки.Организация = &Организация");
ОператорВыбораПродаж.Отбор.Добавить("Продажи.Организация = &Организация");
КонецЕсли; 
Если ЗначениеЗаполнено(Склад) Тогда
ОператорВыбораЗакупок.Отбор.Добавить("Закупки.Склад = &Склад");
ОператорВыбораПродаж.Отбор.Добавить("Продажи.Склад = &Склад");
КонецЕсли;

Пример 2.

Нам нужно отобрать товары, для которых последняя цена выше 1000руб.
Т.е. необходимо
1. Добавить в текст запроса выбор во временную таблицу из регистра цен номенклатуры, по которой цены выше 1000руб.
2. Добавить при выборе данных условия по этой временной таблице в оба запроса выбора данных (закупки и продажи).
Как вклиниваться в текстовый запрос для выполнения этих действий, вы пожете представить самостоятельно.
Программно мы просто добавляем строки кода:

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

ИМХО, даже для этих примеров программная работа с запросом удобнее, чем прямая работа с текстом.
При этом учтем, что данные варианты модификаций все-таки достаточно простые.
С усложнением вариантов модификаций, увеличением количества запросов в пакете, выбором различных модификаций в зависимости от условий (например, добавление условий либо по регистру цен, либо по видам номенклатуры, либо по планам производства) программная работа выглядит всё более удобной по сравнению с работой с текстовой строкой.

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

з.ы. Всё выше написанное всего лишь моё личное понимание темы. Возможно, где-то ошибаюсь. Комментарии и уточнения приветствуются.

upd: Еще один небольшой пример использования схемы запроса. Формирование запроса, выполняющего поиск задвоенных значений предопределенных данных. Без обращения к метаданным формирует один общий запрос ко всем справочникам, планам счетов, ПВХ, ПВР вцелом по конфигурации. Используется в обработке Установка, просмотр и поиск задвоенных предопределенных значений справочников, планов счетов, ПВХ, ПВР.

СхемаЗапроса = Новый СхемаЗапроса;
КоллекцияОператоры = СхемаЗапроса.ПакетЗапросов[0].Операторы;
Для каждого ГруппаТаблиц Из СхемаЗапроса.ПакетЗапросов[0].ДоступныеТаблицы Цикл
	Если ГруппаТаблиц.Представление = "Справочники"
		ИЛИ ГруппаТаблиц.Представление = "ПланыСчетов"
		ИЛИ ГруппаТаблиц.Представление = "ПланыВидовРасчета"
		ИЛИ ГруппаТаблиц.Представление = "ПланыВидовХарактеристик" Тогда
		Для каждого Таблица Из ГруппаТаблиц.Состав Цикл
			Для каждого ПолеТаблицы Из Таблица.Поля Цикл
				Если ПолеТаблицы.Имя = "ИмяПредопределенныхДанных" Тогда
					НовыйОператор = КоллекцияОператоры.Добавить();
					НовыйИсточник = НовыйОператор.Источники.Добавить(Таблица,"СправочникИмя");
					НовыйОператор.ВыбираемыеПоля.Добавить(""""+Таблица.Имя+"""");
					НовыйОператор.ВыбираемыеПоля.Добавить("КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СправочникИмя.ИмяПредопределенныхДанных)" );
					НовыйОператор.Группировка.Добавить("СправочникИмя.ИмяПредопределенныхДанных");
					НовыйОператор.Отбор.Добавить("СправочникИмя.Предопределенный");
					НовыйОператор.Отбор.Добавить("КОЛИЧЕСТВО(РАЗЛИЧНЫЕ СправочникИмя.Ссылка) > 1");
					Продолжить;
				КонецЕсли; 
			КонецЦикла; 
		КонецЦикла; 
	КонецЕсли; 
КонецЦикла; 

 

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

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. Makushimo 155 13.10.14 05:45 Сейчас в теме
Если текст запроса наращивается через менеджер временных таблиц, то в этом случае все также не возможно посмотреть и другие таблицы в менеджере и весь итоговый текст запроса.
Так?
2. ekaruk 5067 13.10.14 08:17 Сейчас в теме
(1) Makushimo, Не совсем поняла вопрос.
Через менеджер запроса текст не наращивается.
Менеджером можно объединить несколько отдельных запросов или пакетов, чтобы они использовали одни и те же временные таблицы.
При формировании запросов, связанных одним менеджером, мы не видим в конструкторе таблиц, связанных с этим менеджером в других запросах.
15. Makushimo 155 14.10.14 08:52 Сейчас в теме
(2)
Очень часто писатели конфигураций используют менеджер временных таблиц для динамического построения одного запроса.
Просто запросы пакета разбросаны по всей конфигурации.
А часто во время отладки хочется понять в каком запросе нужно изменение внести или ошибку найти.
приходится ползать по всем модулям вслед за отладчиком и копипастом в консоли выстраивать весь огромный запрос. Дальше уже с ним баловаться.
Гораздо полезнее было бы реализовать просмотр содержимого Менеджера ВТ - и результата и текста запроса.

А так эта новая фишка делает нечитаемый код динамического запроса еще более нечитаемым.
Может это привыкнуть надо.
Monte Carlo; sanfoto; ntvg; +3 Ответить
78. DmitrySinichnikov 194 02.01.20 17:38 Сейчас в теме
(15) Если вам требуется просмотреть содержимое менеджера, то вот код:
МенеджерВременныхТаблиц.Таблицы[2].ПолучитьДанные().Выгрузить()

Где "2" индекс таблицы из всех таблиц менеджера.
А так схема запросов очень удобная вещь, если требуется генерить запрос с множеством вариаций возвращаемых данных.
79. ekaruk 5067 02.01.20 20:50 Сейчас в теме
(78) Это вроде достаточно новая возможность.
Раньше не было.
5. Yashazz 3250 13.10.14 17:02 Сейчас в теме
...и понеслось...
Жили мы без этой фичи множество времени и дальше проживём. Выморочная вещь, для галочки сделанная.
Вы что, всерьёз верите, что изменять или хотя бы понимать запрос станет проще? Ни разу. Вот увидите, как писатели типовых конф, получив сей инструмент, превратят один ранее заданный куском запрос в нечто, собираемое десятью процедурами, и понять что-то станет ещё тяжелее.

(1) Присоединяюсь к вопросу.
user1243360; DevSerg; the1; A7758735; anchovy; JohnConnor; Alex_CheST; pm74; AlexKo84; Gang031; timeforlive; Ikarus; Восьмой; shalimski; sanfoto; kaging; uri1978; LuxVeritatis; behappyyu; LelikOFF; wunderland; ntvg; KapasMordorov; AnryMc; monkbest; buganov; Трактор; wolfsoft; Dima982; Sergafan10; KonstB; +31 Ответить
10. ekaruk 5067 13.10.14 19:22 Сейчас в теме
(5) Yashazz, Я не совсем поняла вопрос из (1)
Запросы, связанные через менеджер, это разные запросы, работающие с общими временными таблицами.
Насколько я понимаю, через схему запроса мы не можем получить доступ к тексту другого запроса, использующего этот же менеджер.

(9) caponid, собственно, стандартный конструктор запросов это и есть визуальный интерфейс к объекту "Схема запроса". Он выводит все свойства объекта и через него мы можем визуально их просматривать и править.
Чего в нём еще не хватает?
21. MaxDavid 124 14.10.14 22:53 Сейчас в теме
(10)
(9) caponid, собственно, стандартный конструктор запросов это и есть визуальный интерфейс к объекту "Схема запроса". Он выводит все свойства объекта и через него мы можем визуально их просматривать и править.
Чего в нём еще не хватает?
Насколько я понял, хотелка заключалась в автоматической генерации не только текста самого запроса, но и кода построения объектной схемы. И это хорошая хотелка, на мой взгляд. В разы сократит генерацию кода для последующего изменения ))
fanast2; Aleskey_K; ntvg; +3 Ответить
22. ekaruk 5067 14.10.14 23:09 Сейчас в теме
(21) MaxDavid, Я недавно писала обработку по генерации дерева объекта "Схема запроса". В статье ссылка есть. Технически проблем корректной генерации текста схемы нет, можно сделать.
Собственно, один вариант уже есть. Сегодня видела на инфостарте обработку конвертер. Правда, пока не совсем рабочий.
Пока не вижу реального применения такой автогенерации.
66. GANR 30.06.16 13:56 Сейчас в теме
(5) Yashazz, Хорошо, а вот представьте себе ситуацию: вам необходимо НЕ МЕНЯЯ ЭЛЕМЕНТОВ ФОРМ (чтобы было проще обновляться) присоединить к запросам динамических списков нескольких десятков документов типовой конфы некую таблицу (скажем, регистр сведений МоиСтатусыОбъектов) и вывести поля Статус, ДатаУстановкиСтатуса. Как Вы это себе представляете без схемы запроса???
Vladimir Litvinenko; +1 Ответить
3. nihfalck 13.10.14 13:18 Сейчас в теме
по первому примеру - для решения такой задачи я поступаю так:
1. в запросе условие:
		|ГДЕ
		|	ВЫБОР
		|	   КОГДА &ИспользованиеОтбораСклад
		|			ТОГДА СправочникСклады.Ссылка = &Склад
		|		ИНАЧЕ ИСТИНА
		|	КОНЕЦ


2. параметры запроса:
Запрос.УстановитьПараметр("ИспользованиеОтбораСклад", ЗначениеЗаполнено(Склад));
Запрос.УстановитьПараметр("Склад", Склад);


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

но тема интересная - надо покопаться на досуге.
Восьмой; bashinsky; wunderland; olbu; Yimaida; +5 Ответить
4. ekaruk 5067 13.10.14 13:28 Сейчас в теме
(3) nihfalck, На самом деле способов много
Они подробно описаны тут http://infostart.ru/public/77068/

Они хороши, когда мы говорим об 1-2х изменениях.
Но каждая такая модификация все-таки усложняет понимание кода и часто немного замедляет выполнение запроса.
Чем сложнее запрос, тем менее допустимы такие вещи.

33. wolfsoft 2421 15.10.14 11:35 Сейчас в теме
(3) а так не проще?

ГДЕ СправочникСклады.Ссылка = &Склад ИЛИ НЕ &ИспользованиеОтбораСклад
35. ekaruk 5067 15.10.14 11:39 Сейчас в теме
(33) wolfsoft, Проще. Но такое условие отменяет использование индекса по складу. В некоторых неудачных случаях время выполнения увеличится на порядок. При выборе из справочника пофиг, при выборе из РН с миллионами записей это может быть критично.
6. glek 112 13.10.14 17:04 Сейчас в теме
Да, хорошая идея для сложны и/или динамических запросов (научиться бы этим еще пользоваться)
7. caponid 13.10.14 18:34 Сейчас в теме
Можно использовать и для простых запросов - когда надо прочитать реквизит документа из базы чтоб лишний раз не дергать ссылку (т.е. считывать весь набор данных) просто написал запрос, который из метаданных объекта формирует запрос к нужному реквизиту документа.

как пример
		СхемаЗапроса = Новый СхемаЗапроса;
		Пакет = СхемаЗапроса.ПакетЗапросов[0];
		Оператор = Пакет.Операторы[0];
		ИмяТаблицыЗапроса = Пакет.ДоступныеТаблицы.Найти(Источник.Метаданные().ПолноеИмя());
		ТаблицаЗапроса = Оператор.Источники.Добавить(ИмяТаблицыЗапроса);
		ТаблицаЗапроса.Источник.Псевдоним = "ТаблицаЗапроса";
		Для каждого запись Из Структура Цикл
			Если Запись.Значение <> Неопределено Тогда
				стр = СписокСкладов.Добавить(); стр.Склад = запись.Значение;
				Оператор.ВыбираемыеПоля.Добавить(запись.Ключ);
			КонецЕсли; 
		КонецЦикла; 
		Оператор.Отбор.Добавить("ТаблицаЗапроса.Ссылка = &Ссылка");
		
		Запрос = Новый Запрос;
		Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
		Запрос.Параметры.Вставить("Ссылка", Источник.Ссылка);
		РезультатЗапроса = Запрос.Выполнить();
Показать


В структуре список реквизитов, которые надо выбрать - используется что бы проверить на изменение реквизитов по сравнению с сохраненными в базе
53. caponid 30.12.14 17:41 Сейчас в теме
гг, как минимум треть постов - это оправдания. Зачем?
Есть инструменты, которые позволяют что - то упростить, что то сделать (как сделано в типовых - сложить или заменить вставкой/заменой текста) иначе , или для "гиков" вообще через "что то с чем-то" - а то что предложили - это всего лишь тоже инструмент - а пользоваться или нет - это Вы сами решите для себя - я выбор сделал (все реально работает и позволило исключить навскидку 30-50% лишнего кода - вот тут (7)) - и по этому поводу "что это не тру" оправдываться не буду.
8. tormozit 5821 13.10.14 18:49 Сейчас в теме
Я вижу такие применения объектной модели запроса
- внесение точечных модификаций в тексты запросов поставщика для облегчения обновления конфигурации от поставщика
- полные/частичные генераторы текстов запросов
- визуальные средства разработки запросов
Vladimir Litvinenko; herfis; Светлый ум; ntvg; gortol; +5 Ответить
39. monkbest 108 16.10.14 10:49 Сейчас в теме
(8) tormozit, для "точечного изменения" тповых, чтобы потом обновляться?

никогда так не делайте!!!

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

Можно напороться на семантическую ошибку, программа работает без сбоев, но результаты получаются неверные
40. tormozit 5821 16.10.14 10:54 Сейчас в теме
(39) monkbest, проблема известная, но при определенных условиях способ может давать неплохую надежность.
42. monkbest 108 16.10.14 10:59 Сейчас в теме
(40) tormozit, согласен с "но при определенных условиях", уверен, что будут случаи, когда это будет надежно, читабельно и оптимально. но это не про типовые конфигурации:)
45. ekaruk 5067 16.10.14 12:51 Сейчас в теме
(42) У любого механизма свои плюсы и минуса. Просто им нужно уметь пользоваться.
Designer1C; +1 Ответить
46. zfilin 2166 16.10.14 13:22 Сейчас в теме
(45) Нет, коллега, речь идет не о том.
Есть мнение, что у этого механизма плюсов просто нет. Никаких. Именно это и пытается донести не восторженная часть сообщества.

А подходом "Просто им нужно уметь пользоваться", ну давайте на ассемблере теперь писать и с базой работать. Сплошные плюсы - контроль полный, производительность сумасшедшая, просто "пользоваться надо уметь".
fanast2; sanfoto; 1cmax; +3 Ответить
47. baloo 16.10.14 13:48 Сейчас в теме
(46) zfilin, не забывайте, что без ассемблера не было бы языков более высокого уровня. Можно говорить о том что ассемблер не юзабельный и кому он нужен, а можно расматривать как плацдарм для дальнейшего расширения функциональности. Не все нововведения приносят прямую явную пользу конечному потребителю, некоторые могут быть совершенно бесполезны на первый взгляд, но при этом могут создавать мощную точку роста. Возможно это, своего рода голевая передача. Поживём-увидим, я думаю из этого может выпилиться что-нибудь стоящее.
48. wolfsoft 2421 16.10.14 16:30 Сейчас в теме
(47)
не забывайте, что без ассемблера не было бы языков более высокого уровня.

И что? Каждому инструменту своё место. Не нужно микроскопом гвозди забивать. 1С был удобен для быстрой и комфортной разработки учётных программ. А сейчас он по своей громоздкости начинает приближаться к языкам высокого уровня. Скоро будет возникать вопрос, а зачем мне писать программу на 1С, если я тоже самое могу сделать на нормальном языке с нормальной объектной моделью без различных ограничений, накладываемых платформой 1С? У 1С в голове беда - она всё время пытается объять необъятное.
kuza2000; +1 Ответить
51. Поручик 4406 20.10.14 16:22 Сейчас в теме
(48) Ну допустим, тоже самое на другом языке вы сделаете с превеликим геморроем, потому в 1С уже есть набор процедур, функций и классов, именуемых объектами метаданных.
49. zfilin 2166 16.10.14 16:45 Сейчас в теме
(47) baloo, Я и не забываю. Честь и слава пра-программистам.
55. 1cmax 152 15.01.15 23:32 Сейчас в теме
(46) zfilin, правильно! Потому 1с и проблемно-ориентированный, скрывающий реализацию, чтобы можно было спокойно думать о бизнес-логике! для каждой задачи - свои инструменты. Для систем реального времени - ассемблер и низкоуровневый си, а для учетных систем - 1с.
60. romansun 191 23.10.15 13:56 Сейчас в теме
в принципе, в (8) всё ответили по целесообразности
программно формировать таким образом запросы - это как программно формировать СКД - можно, но зачем?
трудозатраты на такую работу будут космические при сомнительного рода полезности


имхо, это полезно там, где возникает задача парсинга текста запросов - визуальные рендеры, построения моделей и прочего всего подобного
9. caponid 13.10.14 19:02 Сейчас в теме
хотелки))
если разработчики платформы добавят в стандартный конструктор запросов вывод не только текста, но и кода построения схемы - то это будет хорошо)
11. jobkostya1c8 13.10.14 22:34 Сейчас в теме
Читал ранее про данный механизм "склеивания" запроса из кусков кода по-человечески. Вроде бы благое дело сделали разработчики платформы 1С 8.3.5, но вот как делал "склеивание" из кусков текста так и буду делать. Почему? Механизм "схема запроса" только вышел и 100% сыроват и там точно есть пара глюков которые на самом виду и которые специально никогда не исправят. Это же не мобильная платформа, не http-сервисы или внешние источники данных которые если начали использовать придется терпеть и обходить баги смекалкой одинэсника :) Придется подождать хотя бы публикаций о багах данного механизма, который очень сильно напоминает программное формирование отчета на СКД: те же сложные типы данных, составляем вручную поля, отборы...
Следующий вопрос: на каком принципе можно получить связи запроса для построения графа?
12. ekaruk 5067 13.10.14 23:29 Сейчас в теме
(11) kostyaomsk, Никто не говорит, что нужно прямо сейчас всё бросить и начать переписывать все запросы через схему запроса.
Просто учитываем, что есть такая возможность и со временем её начнут использовать в типовых.

По поводу графа.
Просто выписываем из СП, какие у объектов есть свойства и какие типы данных допустимы для этих свойств.
Потом просто в текстовом виде связи скармливаем связи графопостроителю. Он уже размещает элементы на листе.
Автоматического определения нет.
Я выписывала для себя в Ексель для этой обработки http://infostart.ru/public/305809/
В ней же выложен приложением исходный текст для графопостроителя и ссылка на него.
help1Ckr; jobkostya1c8; +2 Ответить
13. baloo 14.10.14 07:06 Сейчас в теме
Инересно, на каком уровне всё-таки формируется итогоый SQL-запрос и нет ли в планах добавить к этому механизму отображения SQL-запроса. Если была бы возможность редактировать итоговый запрос к БД - это было бы крайне полезно.
19. ekaruk 5067 14.10.14 22:16 Сейчас в теме
(13) baloo, Мне тоже интересно. Думаю, окончательный вариант текста запроса все-таки за пределами сервера 1С. Не думаю, что целесообразно его редактировать вручную. Слишком разные варианты будут оптимальными в зависимости от данных.
(15) Makushimo, Через схему, к сожалению, такое сделать нельзя. Так как она сейчас все-таки строится на основании текста запроса. Менеджер, грубо говоря, всего лишь связывает запросы в одно пространство, чтобы они использовали общие данные. Но запросы остаются отдельными запросами.
(16) iTony73, Да, мне оже кажется, что схема более применима для модификаций имеющегося запроса, а не для создания с нуля. Вроде эту мысль в статье высказывала.
30. baloo 15.10.14 05:50 Сейчас в теме
(19) не может быть формирование результирующего SQL-запроса за пределами сервера приложений - ему быть больше негде, разве что в скульных хранимках, но разработчик, к счастью не стал на них завязываться, иначе Postgres и DB2 мы бы не увидели.
Поэтому я думаю рано или поздно это будет реализовано.
14. Oleg_nsk 237 14.10.14 08:52 Сейчас в теме
Новшество интересное. По хорошему надо вообще переходить на декларативное описание всего интерфейса 1с на базе XAML. Вот тогда и откроются для разработчика широчайшие возможности для визуализации, отвязанные от чудачеств нынешних творцов, придумывающих свои уникальные велосипеды вроде "Такси"
17. baloo 14.10.14 10:08 Сейчас в теме
(14) Oleg_nsk, ну собственно новый REST-интерфейс Вам в помощь, ну и собственно на базе веб-сервисов можно было пилить свой фронт для нетиповых спокойно. Проблема только в том, что сегодня пилить фронты из 1Сников могут не только лишь все. Мало кто может это делать.
Oleg_nsk; +1 Ответить
16. borda4ev 14.10.14 10:03 Сейчас в теме
Описание, наверное, будет не полным. Если не упомянуть метод УстановитьСхемуЗапроса(ТекстНаписанногоВКонструктореЗапроса)
То есть, можно сначала написать, большой запрос Конструктором. Затем загнать его в Схему, и уже там работать с теми вещами, которые необходимо Алгоритмизировать; Очень крутая штука, не удивлюсь, если через год, это станет стандартом, для программной работы над Запросами!
json; i.kovtun; nihfalck; +3 Ответить
18. zfilin 2166 14.10.14 13:31 Сейчас в теме
Интересный механизм, но практическую пользу понять сложно.
Разработчики давно наловчились динамически делать и менять непосредственно текст запроса, так что вряд ли оно получит широкое применение для того, чтобы что-нибудь изощренно спросить у базы.
Зато в качестве парсера текста запроса (если я правильно понял) вещь незаменимая. Ты ему строку, а он тебе в объект разложил. Красота!

Но зачем это может быть нужно? Сходу не соображу. Писать автоматические переводчики с языка запросов 1С на другой язык? На какой?
Новая супер-консоль запросов, которая более корректно и точно представляет запрос в виде дерева и имеет дополнительные плюшки-навороты? Может быть.
Где еще может быть нужно распрасить текст запроса?
20. ekaruk 5067 14.10.14 22:20 Сейчас в теме
(18) zfilin, Разработчики научились. Но те запросы с собирание пакета из кусочков, что используются сейчас в проведении типовых, как раз имеет смысл формировать через схему. Не думаю, что будут менять имеющиеся, но со временем новые вполне можно формировать программно.
Писать свой конструктор смысла не вижу. Типовой, на мой взгляд, достаточно удобен. Не думаю, что можно написать на УФ его лучше, чем программисты платформы написали на Си.
23. zfilin 2166 14.10.14 23:26 Сейчас в теме
(20) К сожалению, не вижу принципиальной разницы для "читабельности" между
ОператорВыбораПродаж.Отбор.Добавить("НЕ Товары.ЭтоГруппа");

и
ТестЗапроса = ТекстЗапроса + "НЕ Товары.ЭтоГруппа";


Что касается типового конструктора. Да, удобен. Но посмотрите консоль запросов в инструментах разработчика. Отличная вещь.
Непосредственно конструктор там используется стандартный. Но кое-какая работа с текстом запроса идет.
24. ekaruk 5067 14.10.14 23:39 Сейчас в теме
(23) zfilin, Из преимуществ программного добавления:
1. Если мы добавляем условия в имеющийся запрос, то с программным добавлением текст исходного запроса не разрывается и его можно открыть конструктором.
2. Эти два варианта примерно эквивалентны, если мы говорим о добавлении одного условия. Если их десяток (по складу, организации, подразделению, номенклатуре....) и нужно добавить лишь несколько из этого десятка, в зависимости от условий, то програмное добавление удобнее.
3. Схема удобнее, если нужно удалить условия или поля. При любой модификации она остается синтаксически корректной. Например, если мы удаляем колонку, то она автоматически удалится и в выбранных полях и в итогах и в группировках. Вклиниванием в текст пришлось бы вклиниваться в несколько мест.
Разумеется, во многих случаях стандартные варианты удобнее. Я просто предлагаю еще один вариант работы.

Инструментами разработчика пользуюсь, но реально использую очень небольшой набор функционала. Хотя вещь великолепная. Заменяет набор различных обработок.
zarzu; Vladimir Litvinenko; +2 Ответить
26. zfilin 2166 15.10.14 00:09 Сейчас в теме
(24) Убедительно. Посмотрим что будет. =)
25. tormozit 5821 14.10.14 23:56 Сейчас в теме
(23) Уже год как в инструментах разработчика есть свой навороченный конструктор запроса, который в явном виде не предоставляет программной модели, но фактически она там есть.

Большая картинка
А дерево запроса заточено на анализ и отладку, т.е. на работу со всеми блоками текста запроса, которые можно выполнять отдельно.
sanfoto; help1Ckr; okulus; zfilin; +4 Ответить
27. zfilin 2166 15.10.14 00:13 Сейчас в теме
(25) tormozit, Посыпаю голову пеплом, пользуюсь старой версией. А, может, и просто не включал. Но даже там, чем пользуюсь, есть дерево запроса. Отличная вещь.
Собственно об этом и говорю. Запрос разбирается в объектную модель, чтобы предоставить больше возможности для представления разработчику и отладки по-частям.

А как он разбирается? Схемой запроса?
28. tormozit 5821 15.10.14 00:19 Сейчас в теме
(27) zfilin, в ИР запрос разбирается с помощью COM реализации движка GoldParser и самодельной грамматики для языка запросов. Объект СхемаЗапроса появился несколько месяцев назад. Поэтому ИР никак не могла на него опираться до его создания =)
29. zfilin 2166 15.10.14 00:32 Сейчас в теме
80. alexsey777 13.03.20 13:37 Сейчас в теме
(23)Например, запрос динамического списка.
Нужно добавить новое поле.
Если использовать традиционное "склеивание", то это нужно "хардкодить" запрос. А если в следующем релизе его изменят? Добавят условие, соединение с таблицей или сортировку?
Нужно будет заново хардкодить новый запрос.
К тому же проблематичнее обновляться. Уже давно пришел к выводу, что изменения на форме лучше делать программно. Добавлять, удалять, изменять элементы формы. Также и с динамическими списками. Запрос типовой мы не изменяем. Просто его модифицируем программно. При обновлении видим, что запрос модифицируется программно. Значит нужно как минимум его проверить на корректную работоспособность.
Сугубо мое личное мнение. Основанное на личном опыте.
31. DrAku1a 1314 15.10.14 07:16 Сейчас в теме
Делал Визуальная структура запроса ещё когда в ИР не было своего конструктора запросов (но парсер уже был и дерево запроса строил). Разбирал строку сам, без ВК - только хардкор :-)) Кстати, сделано за одну бессонную ночь ))
34. ekaruk 5067 15.10.14 11:36 Сейчас в теме
(31) DrAku1a, Видела Вашу обработку. Красиво сделано.
А вообще давно по себе заметила, что все интересные вещи делаются сразу. Т.е. продумал, сел и написал. Если пытаешься что-то сделать и оно не получается или получается слишком запутанно, то значит плохо продумал, не хватает теоретического понимания темы. Тогда нужно не лепить заплатки, а просто отложить и сделать потом.
(32) mixsture, Если мы формируем запрос текстом и лишь програмно добавляем условие, то он отлично открывается конструктором. Написать "ТекстЗапроса = ТекстЗапроса+<Условие>" мы можем лишь в случае, если условие нужно в конце текста. Если запрос пакетный либо есть итоги, то условия в конец дописать нельзя. Только разрывать запрос.
По строковым функциям согласна, мне их тоже не хватает.
По чтению вроде ж сделали. ИМХО, версионное чтение в 8.3 лучше, чем просто грязное чтение. Данные целостные, блокировок нет и на производительности не сказывается.
Adam12345678; +1 Ответить
37. mixsture 15.10.14 13:42 Сейчас в теме
(34) согласен, запрос открывается. Но программно наложенных отборов в нем не видно. А отборы - очень важная часть запроса. Не видеть их - тоже как бы плохо.
И таким образом поиск ошибок абсолютно не меняется - встаем отладкой перед Запрос.Выполнить и смотрим текст запроса.

Идеальным было бы научить сам объект Запрос корректно оптимизировать условия "флагОтбора или отбор". Тогда можно не рвать запрос и все хорошо открывается в конструкторе, а также все составляющие запроса сразу видны в 1 месте.
32. mixsture 15.10.14 11:15 Сейчас в теме
Я пока тоже не понимаю прелестей объектной модели. Да, текст запроса не рвется на условие - может быть, эстетически это лучше выглядит.
Меня, например, в рвущемся запросе сильно раздражает - что конструктор запроса из конфигуратора не открыть - приходится включать отладку, выдергивать полный текст запроса непосредственно перед Запрос.Выполнить() - и на нем уже открывать конструктор. Я так понимаю, со схемой запроса ситуация ничуть не улучшилась, верно?
Опять же - рвем запрос, как правило, для условного отбора, чтобы работал побыстрее. Есть вариант менее производительный (флаг отбора и отбор объединены по ИЛИ. или как вариант - оператором ВЫБОР):
|ВЫБОР
| КОГДА &ИспользованиеОтбораСклад
| ТОГДА СправочникСклады.Ссылка = &Склад
| ИНАЧЕ ИСТИНА
| КОНЕЦ
В этой ситуации здорово было бы, чтобы оптимизатор понял, что флаг - это константа в запросе, его можно вычислить 1 раз до выполнения запроса и не выполнять проверку условия СправочникСклады.Ссылка = &Склад, если из-за флага туда исполнение не зайдет.
Но он так не умеет и поэтому работает медленнее. И поэтому приходится делать некрасиво, зато быстро
Если флагОтбора Тогда
ТекстЗапроса = ТекстЗапроса + " СправочникСклады.Ссылка = &Склад"
КонецЕсли;
Со схемой запроса получаем абсолютно тоже самое.

Странное направление развития у 1с. Казалось бы, могли бы поправить вычисление "констант" и все за это сказали бы спасибо. Могли бы добавить нормальное количество строковых функций в запросах (почему-то в любом SQL их предостаточно, а 1с решила пойти по пути минимализма). Могли бы добавить возможность вмешиваться в генерируемый на чистом SQL запрос - например, программист смог бы делать грязное чтение - иногда точность последних данных не критична, зато быстрее. Но 1с вводит сомнительные улучшения.
fanast2; Восьмой; sanfoto; chuck; ntvg; zfilin; monkbest; +7 Ответить
38. DrAku1a 1314 16.10.14 02:27 Сейчас в теме
(32)
Если НЕ флагОтбора Тогда
  ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "СправочникСклады.Ссылка = &Склад", "ИСТИНА")
КонецЕсли;
monkbest; +1 Ответить
52. Огонек 23 30.12.14 16:55 Сейчас в теме
(32) mixsture,
чтобы не городить в тексте запроса конструкций типа:
|ВЫБОР
| КОГДА &ИспользованиеОтбораСклад
| ТОГДА СправочникСклады.Ссылка = &Склад
| ИНАЧЕ ИСТИНА
| КОНЕЦ

Я добавляю в текст запроса равенство типа
ТекстЗапроса = "...ГДЕ 1 = 1 И 2 = 2...";

Далее, анализ выбранных значений и при необходимости модификация текста запроса:
Если ИспользованиеОтбораСклад Тогда
ЗапросТекст = СтрЗаменить(ЗапросТекст, "1 = 1", "СправочникСклады.Ссылка = &Склад");
Запрос.УстановитьПараметр("Склад", ВыбСклад);
КонецЕсли;
36. poyson 15.10.14 12:00 Сейчас в теме
+ толково и понятно. спасибо
41. monkbest 108 16.10.14 10:55 Сейчас в теме
Не дай бог в типовых начнут применять

Я уже наелся, когда в отчете на схеме компановке на кой-то хрен подменяют перед формированием запрос, получая его из общего модуля при этом несколько раз применив к тексту "СтрЗаменить(ТекстЗапроса,...,...)" и вызвав 10 вложенных функций.
Итак в этой каше отлаживаться и добавлять свой функционал - огромные трудозатраты.
А теперь вообще жесть будет.

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

Для масштабируемости решений главное - читабельность, а это новшество уничтожает читабельность.
anchovy; defini; ntvg; yandextesting; +4 Ответить
43. yandextesting 144 16.10.14 12:33 Сейчас в теме
(41) надеюсь в типовых оставят нормальные тексты запросов, а это чудо предложат использовать для модификации типовых решений, например, в не меньшем чуде - расширении конфигуратора, чтобы не "портить" исходный текст запроса
44. ekaruk 5067 16.10.14 12:48 Сейчас в теме
(43) yandextesting, Насколько я понимаю, через расширение конфигурации доступа к переменным не будет. Только к объектам. А схема запроса в данном случае просто переменная.
Схема запроса более стандартный механизм. Думаю, будут использовать в типовых решениях.
50. DrAku1a 1314 17.10.14 02:08 Сейчас в теме
(41) Точку останова ставите на Запрос.Выполнить() и отладчиком запросом или консолью запросов из ИР открываете (и там и там есть описание - как делать, в ИР это даже проще).

А объектная модель может быть использована для грамотного парсинга запросов в самых разных консолях - в т.ч. и под управляемые формы, т.к. с ней - не требуется извращаться с ВК. Можно написать свой конструктор запросов... Да много чего ещё можно сделать.

(48) По поводу громоздкости - согласен, не всегда удобно. Но и объёмы данных приходится представлять тоже немалые...
zfilin; ntvg; +2 Ответить
54. 1cmax 152 15.01.15 23:23 Сейчас в теме
мда... отладка и правда затруднилась донельзя.
в общем-то поддержка измененных типовых усложнилась нехило.
теперь видать еще сложнее будет..
56. PetroP 24.03.15 17:42 Сейчас в теме
Немного не согласен по поводу терминологии:
Зеленым - стандартные типы 1С (строка, число, булево);
Бирюзовым - примитивные типы, специфичные для схемы запроса;


Правильнее было бы:

Зеленым - примитивные типы (строка, число, булево);
Бирюзовым - системные перечисления, использующиеся в схеме запроса.
57. i.kovtun 158 02.04.15 20:24 Сейчас в теме
Спасибо за работу!
ИМХО желательно избавляться от констант при обращении к объектам по индексам, это очень часто приводит к ошибкам.
58. Midasu 15.08.15 23:26 Сейчас в теме
Прошу прощения, но прочитав публикацию и увидев:
>>изменение имеющегося запроса
Я подумал, что можно писать обычный запрос, а потом обратиться к его объектам и изменить что нужно, не разрывая, но в публикации не нашёл такой реализации. Это невозможно? Тогда подпишусь под комментаторами, считающими это нагромождением, тем более без штатного конструктора.

UPD: нашёл описание нужной реализации на сайте 1С, вот так делается:
Alex_Alex; +1 Ответить
59. Yashazz 3250 04.10.15 22:58 Сейчас в теме
Не то чтобы я злорадствовал, но - всем торопыгам на заметку: никогда не бросайтесь сразу осваивать новинки платформы. Вы с ними ещё намучаетесь, причём особенно благодаря оптимизациям и доработкам, каковые будут делать "вдогонку" их авторы - разрабы платформы.
Вот почитайте, сколько всего доработано по объектной модели запроса в 8.3.7, и подумайте - а стоило горбатиться раньше-то?

Терпение, терпение). Юзайте уже устаканившееся, меньше переделывать придётся)))

P.S. Считайте это моим общим ответом автору публикации, большой любительнице интенсивно копаться в каждой полусырой новинке)
61. BurningChrome 198 21.12.15 17:18 Сейчас в теме
А теперь попробуйте добавить или удалить при помощи "Схемы запроса" условия виртуальных таблиц. Сразу вся хваленная стройность "модели" разваливается в старый добрый СтрЗаменить :(
62. ekaruk 5067 21.12.15 17:23 Сейчас в теме
(61) BurningChrome, Замечательно добавляются вообще-то.
ИсточникСхемыЗапроса.Источник.Параметры[0].Выражение = Новый ВыражениеСхемыЗапроса("&КонецПериода"); 
ИсточникСхемыЗапроса.Источник.Параметры[1].Выражение = Новый ВыражениеСхемыЗапроса("Организация = &Организация"); 
63. BurningChrome 198 22.12.15 11:32 Сейчас в теме
(62) Это не добавление, а установка нового. Попробуйте добавить к "Организации", например еще "Контрагента"? А если надо к существующему условию:
Товар В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
	ОстаткиИОбороты.Товар
	ИЗ
	ОстаткиИОбороты)
И Организация = &Организация

добавить еще например
Договор В (&Договоры)
?
Красиво получается?
64. CagoBHuK 32 11.02.16 15:39 Сейчас в теме
Передо мной стояла вполне реальная задача. Запрос выбирал во множество временных таблиц нужные мне данные. В результате мне нужно было получить всё содержимое всех полученных таблиц для последующей обработки. Причем, набор полученных в результате таблиц мне заранее не был известен, т.к. запрос в функцию передавался динамически. До появления объектной модели запроса мне приходилось регулярным выражением вычленять оставшиеся в процессе выполнения запроса таблицы, учитывая все ПОМЕСТИТЬ и УНИЧТОЖИТЬ, теперь же я могу не использовать внешние компоненты, хотя это и приходится делать несколько более громоздким способом. Таким образом я получаю структуру из нескольких таблиц в результате выполнения всего одного запроса.
65. timeforlive 15 21.04.16 11:12 Сейчас в теме
Еще не приступил к знакомству к новому механизму, но спешу поинтересоваться вот чем:
1. есть ли возможность добавлять комментарии в создаваемый запрос через СхемуЗапроса (т.е. во время отладки при определении выражения переменной, присвоенной методом ПолучитьТекстЗапроса можно будует просмотреть запрос целиком, а что на счет комментариев в этом тексте)?
67. Tyson43133 17.07.16 00:34 Сейчас в теме
Любой сложный запрос, т.е реально сложный запрос, где в условиях сравнения используются не значения типа "равно", а >=,>,<,<=, где более 5-7 JOIN-ов и где очень хочется заюзать корреллируемый подзапрос (напомню, в 1С их нет!!!) лично я использую старую добрую консоль запросов и модель запроса составляю вручную. Как можно какой-то объектной схемой написать то, что я делаю на старом добром SQL у меня даже в уме не укладывается!!! Может я чего-то не до понял в языке запросов? Хм...
68. 1prog@bk.ru 11 31.08.16 07:46 Сейчас в теме
Всем привет! такой вопрос, подскажите пож-та!

В запрос в качестве таблицы-источника можно использовать таблицу значений, предварительно ее "типизировать" и передать параметром запроса, как такое провернуть используя схему запроса?


Пример:

Запрос.УстановитьПараметр("ТаблицаИсточник ", ТаблицаИсточник );

...

"ВЫБРАТЬ
| ТаблицаИсточник .Поле1,
| ТаблицаИсточник .Поле2
|ПОМЕСТИТЬ ВТ_ТаблицаИсточник
|ИЗ
| &ТаблицаИсточник КАК ТаблицаИсточник
|;
...
69. 1prog@bk.ru 11 31.08.16 08:42 Сейчас в теме
(68) 1prog@bk.ru,
решено
ИсточникПакета0 = ОператорыПакет0.Источники.Добавить(Тип("ОписаниеВременнойТаблицыСхемыЗапроса"),"&ТаблицаИсточник ");

еще Важный момент :

ОператорыТекПакет.ВыбираемыеПоля.Добавить("ТаблицаИсточник ."+поле);
70. Spacer 302 08.02.17 15:59 Сейчас в теме
Может кому пригодится:
Добавляем в качестве источника вложенный запрос.
Здесь "Список.ТекстЗапроса" - это текст запроса динамического списка.

	СхемаЗапроса = Новый СхемаЗапроса;
	СхемаЗапроса.УстановитьТекстЗапроса(Список.ТекстЗапроса);
	
	ЗапросВыбора = СхемаЗапроса.ПакетЗапросов[0];
	ОператорВыбрать = ЗапросВыбора.Операторы[0];
	
	ОсновнойИсточник = ОператорВыбрать.Источники[0];
	
	ВложенныйЗапросПеремещения =
	"ВЫБРАТЬ
	|	ПеремещениеТоваров.ЗаказНаПеремещение.ДокументОснование КАК ЗаказНаПеремещениеДокументОснование,
	|	МАКСИМУМ(ИСТИНА) КАК ЕстьНезакрытыеПеремещения
	|ИЗ
	|	Документ.ПеремещениеТоваров КАК ПеремещениеТоваров
	|ГДЕ
	|	ПеремещениеТоваров.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыПеремещенийТоваров.Принято)
	|	И ПеремещениеТоваров.Проведен = ИСТИНА
	|
	|СГРУППИРОВАТЬ ПО
	|	ПеремещениеТоваров.ЗаказНаПеремещение.ДокументОснование";
	
	НовыйИсточник = ОператорВыбрать.Источники.Добавить(Тип("ВложенныйЗапросСхемыЗапроса"), "ВложенныйЗапросПеремещения");
	НовыйИсточник.Источник.Запрос.УстановитьТекстЗапроса(ВложенныйЗапросПеремещения);
	НовыйИсточник.Соединения.Добавить(ОсновнойИсточник, "ДокументЗаказКлиента.Ссылка = ВложенныйЗапросПеремещения.ЗаказНаПеремещениеДокументОснование");
	НовыйИсточник.Соединения[0].ТипСоединения = ТипСоединенияСхемыЗапроса.ПравоеВнешнее;

	Список.ТекстЗапроса = СхемаЗапроса.ПолучитьТекстЗапроса();
Показать
Shrayky2; testnv0; Lehha; +3 Ответить
71. fixin 3976 23.06.17 00:37 Сейчас в теме
А где в схеме запроса хранятся условия вида {ГДЕ ....} т.е. в фигурных скобочках?
its64; aleksey_vk; alest; unmensch; +4 Ответить
81. alexsey777 13.03.20 13:45 Сейчас в теме
(71)
СхемаЗапроса.ПакетЗапросов[0].Операторы[0].ВыраженияОтбораКомпоновкиДанных

Доступен, начиная с версии 8.3.14.

Кстати, столкнулся с проблемой. При установке текста запроса автоматически присваиваются псевдонимы полей компоновки данных.
Пришлось их очищать.
Прикрепленные файлы:
72. Mihamak 21.09.17 05:14 Сейчас в теме
Столкнулся с интересной особенностью при модификации имеющегося запроса.
В запросе есть Полное соединение. Я хочу добавить еще одно.
Но при добавлении нельзя указать тип соединения, оно по умолчанию левое. Поэтому при вызове Соединения.Добавить() падает исключение "Противоречивая связь".
74. radian 29.11.18 10:32 Сейчас в теме
(72) Так же поймал эту проблему. В функции Добавить соединения отсутствует возможность указать тип соединения. А добавление с типом соединения по умолчанию вызывает исключение, если тип существующего соединения не Левое.
Необходимо было в текст соединения двух таблиц запроса:
		|ИЗ
		|	ВТОтборовСотрудников КАК ТаблицаОтборов
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам КАК ЛицевыеСчетаСотрудников
		|		ПО ТаблицаОтборов.ФизическоеЛицо = ЛицевыеСчетаСотрудников.ФизическоеЛицо
		|			И (ВЫБОР
		|				КОГДА ТаблицаОтборов.Период = ДАТАВРЕМЯ(1, 1, 1)
		|					ТОГДА &МаксимальнаяДата
		|				ИНАЧЕ ТаблицаОтборов.Период
		|			КОНЕЦ >= ЛицевыеСчетаСотрудников.ДатаОткрытияЛицевогоСчета)
Показать


добавить условие
		|		И ТаблицаОтборов.Сотрудник.ГоловнаяОрганизация = ЛицевыеСчетаСотрудников..Организация.ГоловнаяОрганизация


Планировал сделать так:
		Соединения = СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники[0].Соединения;
		ДобавляемоеУсловие = Новый ВыражениеСхемыЗапроса("ТаблицаОтборов.Сотрудник.ГоловнаяОрганизация = ЛицевыеСчетаСотрудников.Организация.ГоловнаяОрганизация");
		Соединения.Добавить("ТаблицаОтборов", ДобавляемоеУсловие);
		ПозицияУсловия = Соединения.Количество()-1;
		Соединения[ПозицияУсловия].ТипСоединения = ТипСоединенияСхемыЗапроса.Внутреннее;

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

Обошел это ограничение, добавив необходимое мне условие в одно из существующих соединений, модифицировав тест условия:
	//Обходим соединения и позиционируемся на соединении по искомому условию 
	Для Каждого Соединение Из СхемаЗапроса.ПакетЗапросов[0].Операторы[0].Источники[0].Соединения Цикл
		Если Соединение.Условие = ИскомоеУсловие Тогда
			//Добавляем в условие по физлицу условие по организации
			Соединение.Условие = Новый ВыражениеСхемыЗапроса("ТаблицаОтборов.Сотрудник.ФизическоеЛицо = ЛицевыеСчетаСотрудников.ФизическоеЛицо И ТаблицаОтборов.Сотрудник.ГоловнаяОрганизация = ЛицевыеСчетаСотрудников.Организация.ГоловнаяОрганизация");
		КонецЕсли;
	КонецЦикла;
Показать

В итоге доработанный текст запроса стал выглядеть так:
		|ИЗ
		|	ВТОтборовСотрудников КАК ТаблицаОтборов
		|		ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЛицевыеСчетаСотрудниковПоЗарплатнымПроектам КАК ЛицевыеСчетаСотрудников
		|		ПО (ТаблицаОтборов.ФизическоеЛицо = ЛицевыеСчетаСотрудников.ФизическоеЛицо
		|			И ТаблицаОтборов.Сотрудник.ГоловнаяОрганизация = ЛицевыеСчетаСотрудников..Организация.ГоловнаяОрганизация)
		|			И (ВЫБОР
		|				КОГДА ТаблицаОтборов.Период = ДАТАВРЕМЯ(1, 1, 1)
		|					ТОГДА &МаксимальнаяДата
		|				ИНАЧЕ ТаблицаОтборов.Период
		|			КОНЕЦ >= ЛицевыеСчетаСотрудников.ДатаОткрытияЛицевогоСчета)
Показать

В отдельных простых ситуациях это выход.
Но хотелось бы понимать как правильно добавлять условия в существующие "не левые" соединения.
Была следующая идея:
1. Пробежаться по существующим условиям в которые необходимо добавить свое.
2. Сохранить их и тип связи.
3. Очистить существующие соединения.
4. По списку (таблице) сохраненных условий соедиения создать новые с типом соединения "Левое" (т.е. "по умолчанию").
5. Добавить свое условие (так же с типом соединения "Левое").
6. Изменить тип соединения на необходимое ("Внутреннее", "ПолноеВнешнее", "ПравоеВнешнее")
Предполагаю, что алгоритм правильный, но пока реализовать руки не дошли (работает выше описанный вариант).
Подводный камень вижу при попытке изменить тип соединения для одного из условий, когда условий больше одного. Нужно проверить.
Если дойдут руки проверить - отпишусь.
73. bad_wag 29 13.08.18 13:29 Сейчас в теме
А можно ли из схемы получить текст отдельного запроса формирующего временную таблицу?
75. varziev 06.07.19 16:10 Сейчас в теме
Как описать конструкцию
Выбрать *
в схеме запроса, а точнее в операторе пакета запроса, что бы не перечислять все поля из источника?
76. Denic_01 29 27.08.19 10:16 Сейчас в теме
налетел на проблему - пытаюсь менять запросы типовой конфы через схему запроса
так там используются комментарии, наподобие, "//ОператорПОМЕСТИТЬ"
которые, дальше, меняются на куски кода

при преобразовании в СЗ и обратно они теряются и усё приплыли ..... кто нибудь решал такую задачу ?
77. CagoBHuK 32 28.08.19 16:55 Сейчас в теме
(76) Все верно, теряются, конструктор запроса сам производит форматирование и обрезает незначащие куски.
Оставьте свое сообщение

См. также

3 онлайн-курса по 1С-программированию: обмен данными, расчетные задачи и бухгалтерские задачи с 12 мая по 8 июля 2020 г. Промо

Практика программирования v8 Бесплатно (free)

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

22.04.2020    4387    23    Infostart    2    

Есть ли жизнь после внедрения, или упрощаем работу в сопровождении

Управление проектом Бесплатно (free)

Из-за отсутствия грамотных правил разработки на этапе внедрения сильно усложняется работа по поддержке и развитию типовых доработанных конфигураций. О некоторых правилах и подходах в разработке, которые помогут специалистам сопровождать внедренное решение, на конференции Infostart Event 2019 Inception рассказал разработчик компании «Инвестиционная группа Абсолют» Алексей Степаненко.

08.06.2020    3593    0    stepan96    11    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    18414    0    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    17915    0    John_d    22    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    35288    0    unichkin    45    

Последовательности событий. Шпаргалка

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    12987    0    kuzyara    33    

30 задач. Странных и не очень

Практика программирования v8 Бесплатно (free)

30 задач на знание языка программирования 1С и некоторого поведения платформы. Маленьких. Странных и не очень.

02.12.2019    14402    0    YPermitin    72    

Как передать IP адрес, который вызвал HTTP запрос в 1C (для веб-сервера Apache)

Практика программирования v8 Бесплатно (free)

Столкнулся с задачей получения IP адреса, который вызывает http сервис 1С. Итак, решение:

22.11.2019    6455    0    Sibars    19    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    27682    0    tormozit    100    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

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

01.10.2019    27722    0    Yashazz    45    

[Шпаргалка] Программное создание элементов формы

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

Программное создание практически всех популярных элементов формы.

06.09.2019    38716    0    rpgshnik    62    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

05.09.2019    40785    0    ids79    52    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

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

20.09.2012    75192    0    tormozit    129    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    23990    0    YPermitin    24    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

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

03.09.2019    22863    0    YPermitin    80    

Отслеживание выполнения фонового задания

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

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    27774    0    ids79    16    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

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

11.07.2007    46092    0    tormozit    38    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    63306    0    ids79    40    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

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

02.08.2019    28750    0    avalakh    21    

Разбираемся с параметрами редактирования СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Связь по типу, Параметры выбора, Связи параметров выбора

31.07.2019    19245    0    json    12    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    42073    0    tormozit    74    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    47637    0    ids79    11    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    30977    0    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    23497    0    YPermitin    13    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    15262    0    m-rv    2    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    17516    0    SeiOkami    50    

Работа с настройками системы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

02.07.2019    37622    0    ids79    10    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    45281    0    ids79    20    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

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

16.04.2019    18932    0    m-rv    17    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    22644    0    dmurk    144    

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

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    37937    0    YPermitin    30    

Выполнение внешней обработки в фоновом задании

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    26138    0    Eret1k    23    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    28619    0    m-rv    21    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    31616    0    ellavs    126    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    25091    0    ellavs    88    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    28493    0    YPermitin    53    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

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

05.12.2017    26665    0    itriot11    34    

Разработка и сценарное тестирование с Vanessa-ADD. Отчетность Allure. Автоматизация запуска сценариев

Практика программирования Vanessa Automation v8 Россия Бесплатно (free)

Формируем отчетность о результатах выполнения сценариев. Автоматизируем запуск.

26.02.2019    19865    0    Vladimir Litvinenko    27    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    34029    0    ids79    9    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    73096    0    Serginio    108    

EnterpriseData – часть 2. Процесс выгрузки данных

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    24420    0    ids79    31    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    37411    0    ids79    72    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С Промо

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    32082    0    ids79    40    

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации

Практика программирования Обмен через XML v8 v8::УФ БП3.0 УТ11 Россия Бесплатно (free)

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    33828    0    ids79    32    

Программное заполнение пользовательских параметров и отборов СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

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

13.11.2018    40652    0    Unk92    21    

Тестер: частые вопросы Промо

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    27314    0    grumagargler    26