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

Публикация № 382500 24.07.15

Приемы и методы разработки - Запросы

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

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

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

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

При написании текста запроса следует учитывать то, что при его исполнении в динамическом списке платформа модифицирует запрос - добавляется выбор порции данных ("ПЕРВЫЕ N"), условие на граничную ссылку, а также сортировка по дате и ссылке или по определенным в настройках полям сортировки. Таким образом, отладка текста запроса через консоль не является правильным, т.к. платформа фактически будет исполнять совсем другой запрос.

Дополнительные неудобства доставляет тот факт, что в платформе нет удобных инструментов для отладки запросов динамических списков. Стандартный замер производительности ничего не покажет. Но получить длительность и план исполнения запроса можно через технологический журнал, или трассировку запросов в СУБД.

Рассмотрим несколько примеров и способов их оптимизации.

Запросы упрощены, чтобы более четко была видна проблема.

 

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

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

Много раз сталкивался с тем, что это реализовывали путем левого соединения таблиц с последующей группировкой:

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

СГРУППИРОВАТЬ ПО
	Р.Ссылка,
	Р.Контрагент,
	Р.Склад

При фактическом выполнении запроса получаем такую статистику:

В плане запроса на стрелках обозначено количество обработанных строк из таблиц.

Или такой вариант в комментариях предлагают:

ВЫБРАТЬ
	Р.Ссылка,
	Р.Контрагент,
	Р.Склад,
	ЕСТЬNULL(Х.Признак, ЛОЖЬ) КАК ЕстьСФ
ИЗ
	Документ.РеализацияТоваровУслуг КАК Р
		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
			ИСТИНА КАК Признак,
			Х.ДокументОснование КАК ДокументОснование
		ИЗ
			Документ.СчетФактураВыданный КАК Х) КАК Х
		ПО Р.Ссылка = Х.ДокументОснование

Во втором случае ситуация значительно лучше, но когда начинают соединять по 3-4-5 таблиц, а еще и со вложенными запросами без отборов (например, виртуальные таблицы), то время исполнения запроса увеличивается в разы и порядки.

При этом важно понимать, что второй запрос также крайне не оптимален - вложенный подзапрос не содержит отбора.
В MSSQL он работает быстро, т.к. оптимизатор этой СУБД достаточно "умный" и понимает, что можно отфильтровать данные, а не выбирать все.

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

18:36.368001-155991,DBV8DBEng,2,process=1CV8C,Trans=0,Sql="SELECT TOP 45
T4._IDRRef,
T4._Fld2070RRef,
ISNULL(T5.Q_001_F_000_,FALSE),
T4._Marked,
T4._Posted,
T4._Date_Time
FROM _Document59 T4
LEFT OUTER JOIN (SELECT DISTINCT
TRUE AS Q_001_F_000_,
T6._Fld428_TYPE AS Q_001_F_001_TYPE,
T6._Fld428_RTRef AS Q_001_F_001_RTRef,
T6._Fld428_RRRef AS Q_001_F_001_RRRef
FROM _Reference53 T6) T5
ON (0x08 = T5.Q_001_F_001_TYPE AND 0x0000003B = T5.Q_001_F_001_RTRef AND T4._IDRRef = T5.Q_001_F_001_RRRef)
WHERE T4._Date_Time < {ts '2015-05-14 17:49:12'}
ORDER BY (T4._Date_Time) DESC, (T4._IDRRef) DESC",NParams=0,

planSQLText='Fields:(
    T4._IDRRef,
    T4._Fld2070RRef,
    ISNULL(T5.Q_001_F_000_,FALSE),
    T4._Marked,
    T4._Posted,
    T4._Date_Time
)
_DOCUMENT59 (T4) RANGE SCAN USING REVERSE INDEX (_DOCUMENT59_BYDOCDATE_TRL) (1 fields)

NESTED OUTER LOOP BY SELECT RANGE SCAN USING INDEX (AUTOINDEX) (1 fields)

(
    Fields:(
        TRUE,
        T6._Fld428_TYPE,
        T6._Fld428_RTRef,
        T6._Fld428_RRRef
    )
    _REFERENCE53 (T6) FULL SCAN


    WITHOUT DUPLICATES
    SORTING
)
WHERE
        (08 = T5.Q_001_F_001_TYPE)
        AND
        (0000003B = T5.Q_001_F_001_RTRef)
        AND
        (T4._IDRRef = T5.Q_001_F_001_RRRef)

Statistics: RecordsScanned = 27345, ParseTime = 0, ExecuteTime = 79, BuffersMemory = 25699, ResultRecords = 45, RecordSize = 57',Rows=45,Context=ДинамическийСписок.ПолучитьДанные : ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Реквизит.ДС

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

Запрос можно преобразовать в декларативном стиле:

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

Несколько раз слышал от "true SQL DBA", что такой подход не очень желателен, т.к. оставляет меньше свободы оптимизатору СУБД на выбор плана исполнения, но работает ведь существенно быстрее!

Оптимизированный запрос:

В файловом варианте все также работает быстро:

31:41.704020-3,DBV8DBEng,2,process=1CV8C,Trans=0,Sql="SELECT TOP 45
T3._IDRRef,
T3._Fld2070RRef,
CASE WHEN EXISTS(SELECT
1 AS Q_001_F_000_
FROM _Reference53 T4
WHERE (0x08 = T4._Fld428_TYPE AND 0x0000003B = T4._Fld428_RTRef AND T3._IDRRef = T4._Fld428_RRRef)) THEN TRUE ELSE FALSE END,
T3._Marked,
T3._Posted,
T3._Date_Time
FROM _Document59 T3
WHERE T3._Date_Time < {ts '2015-05-26 14:54:58'}
ORDER BY (T3._Date_Time) DESC, (T3._IDRRef) DESC",NParams=0,planSQLText='Fields:(
    T3._IDRRef,
    T3._Fld2070RRef,
    CASE  WHEN EXISTS(SELECT
            Fields:(
                1
            )
            _REFERENCE53 (T4) RANGE SCAN USING INDEX (_REFERENC53_BYFIELD8195_RSRL) (3 fields)
            WHERE
                    (0000003B = T4._Fld428_RTRef)
                    AND
                    (T3._IDRRef = T4._Fld428_RRRef)

            ) THEN TRUE ELSE FALSEEND,
    T3._Marked,
    T3._Posted,
    T3._Date_Time
)
_DOCUMENT59 (T3) RANGE SCAN USING REVERSE INDEX (_DOCUMENT59_BYDOCDATE_TRL) (1 fields)


Statistics: RecordsScanned = 61, ParseTime = 1, ExecuteTime = 0, BuffersMemory = 25699, ResultRecords = 45, RecordSize = 57',Rows=45,Context=ДинамическийСписок.ПолучитьДанные : ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Реквизит.ДС

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

Пример 2. Соединение таблицы с небольшим набором относительно статичных данных.

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

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

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

Но зачем вообще вовлекать регистр сведений в этот запрос? Перечень складов относительно небольшой и статичный, его можно сформировать при открытии формы, а затем передать как параметр запроса динамического списка.

ВЫБРАТЬ
	Р.Ссылка,
	Р.Контрагент,
	Р.Склад
ИЗ
	Документ.РеализацияТоваровУслуг КАК Р
ГДЕ
	Р.Склад В(&Склады)

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

 

Пример 3. Использование "В ИЕРАРХИИ" в условии запроса.

Частным сценарием является фильтрация списка по группе элементов (группа складов или группа номенклатуры, например).

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

ВЫБРАТЬ
	Р.Ссылка,
	Р.Контрагент,
	Р.Склад
ИЗ
	Документ.РеализацияТоваровУслуг КАК Р
ГДЕ
	Р.Склад В ИЕРАРХИИ(&ГруппаСкладов)

В этом случае, платформа будет формировать перечень складов, входящих в данную группу при каждом обновлении списка. Результат не кэшируется!

Вот трассировка одного обновления формы списка для данного запроса:

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

Решением может быть самостоятельное формирование списка складов при изменении отбора и передача его в качестве параметра - это позволит заменить "В ИЕРАРХИИ" на просто "В".

Выбраем все склады вне динамического списка:

ВЫБРАТЬ
	Склады.Ссылка
ИЗ
	Справочник.Склады КАК Склады
ГДЕ
	Склады.Ссылка В ИЕРАРХИИ(&ГруппаСкладов)

Выгружаем в массив и передаем в динамический список.

Запрос при этом упрощается до:

ВЫБРАТЬ
	Р.Ссылка,
	Р.Контрагент,
	Р.Склад
ИЗ
	Документ.РеализацияТоваровУслуг КАК Р
ГДЕ
	Р.Склад В (&СписокСкладов)

Количество запросов к MSSQL уменьшается:

При этом следует учесть, что в платформе есть определенное ограничение на количество параметров, передаваемых в запрос (256?).

Если число элементов в параметре "&СписокСкладов" превысит это ограничение, то платформа меняет текст запроса.

Вместо обычной выборки из списка:

WHERE ((T1._Fld8774RRef IN (@P1, @P2, @P3, @P4, @P5, ...)

будет выборка из временной таблицы:

WHERE (T3._Fld8774RRef IN
(SELECT
T4._INVALUELISTRRef AS INVALUELISTRRef
FROM #tt4 T4 WITH(NOLOCK)
WHERE T4._INVALUELISTRRef IS NOT NULL))

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

Пример 4. Из смежных таблиц требуется получение дополнительных данных.

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

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

Вот это, например, работает довольно медленно:

ВЫБРАТЬ
	ДокументСчетФактураПолученный.Ссылка,
	ДокументСчетФактураПолученный.ВерсияДанных,
	ДокументСчетФактураПолученный.ПометкаУдаления,
	ДокументСчетФактураПолученный.Номер,
...
	МАКСИМУМ(ЗначенияСвойствОбъектов.Значение) КАК НомерЗаявкиНаОсвоение
ИЗ
	Документ.СчетФактураПолученный КАК ДокументСчетФактураПолученный
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.СчетФактураПолученный.ДокументыОснования КАК СчетФактураПолученныйДокументыОснования
			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияСвойствОбъектов КАК ЗначенияСвойствОбъектов
			ПО СчетФактураПолученныйДокументыОснования.ДокументОснование = ЗначенияСвойствОбъектов.Объект
				И (ЗначенияСвойствОбъектов.Свойство = ЗНАЧЕНИЕ(ПланВидовХарактеристик.СвойстваОбъектов.ПереданОригиналВБухгалтерию))
		ПО (СчетФактураПолученныйДокументыОснования.Ссылка = ДокументСчетФактураПолученный.Ссылка)

СГРУППИРОВАТЬ ПО
	ДокументСчетФактураПолученный.Ссылка,
	ДокументСчетФактураПолученный.ВерсияДанных,
	ДокументСчетФактураПолученный.ПометкаУдаления,
	ДокументСчетФактураПолученный.Номер

Как мне кажется, оптимальным решением тут было бы кэширование результатов в промежуточной таблице.

Создать регистр сведений "КэшЗначенийСчетФактураПолученный" с измерением "Объект" и ресурсом "НомерЗаявкиНаОсвоение".

Запись в этот регистр сведений производить при записи самого счет-фактуры, а также при записи самой "заявки на освоение" (если изменился номер, то найти введенные СФ и обновить номера в регистре).

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

Запрос получается существенно проще:

ВЫБРАТЬ
	ДокументСчетФактураПолученный.Ссылка,
	ДокументСчетФактураПолученный.ВерсияДанных,
	ДокументСчетФактураПолученный.ПометкаУдаления,
	ДокументСчетФактураПолученный.Номер,
	ЕСТЬNULL(КэшЗначенийСчетФактураПолученный.НомерЗаявкиНаОсвоение, "") КАК НомерЗаявкиНаОсвоение
ИЗ
	Документ.СчетФактураПолученный КАК ДокументСчетФактураПолученный
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КэшЗначенийСчетФактураПолученный КАК КэшЗначенийСчетФактураПолученный
		ПО ДокументСчетФактураПолученный.Ссылка = КэшЗначенийСчетФактураПолученный.Объект

Пример 5. Сложные опциональные отборы

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

Пример из нашей практики: есть список документов "Инцидент" и регистр сведений с комментариями пользователей по этим инцидентам. Пользователи просили дать возможность отбирать список документов по пользователям из комментариев, например, показать все инциденты, которые прокомментировал Иванов.

Стандартным отбором тут не обойтись, и как вариант, можно доработать запрос динамического списка:

 

Если параметр "Автор комментария" заполнен пустой ссылкой - срабатывает левая часть условия и показываются все документы.

Если в параметре указан пользователь, то список фильтруется по регистру сведений.

При этом СУБД для обоих вариантов будет строить одинаковый план запроса с выборкой из регистра сведений. В некоторых ситуациях это влияет на производительность весьма негативно.

 

Чтобы обойти эту проблему - необходимо переписать запрос с использованием функционала компоновки. Фактически сделать условие опциональным:

В этом случае, если параметр "Автор комментария" не заполнен, то данный участок исключается из текста запроса.

План запроса при этом получается чуть проще:

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

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

 

Буду признателен за комментарии с дополнениями и собственным опытом.

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. rozer 297 24.07.15 11:57 Сейчас в теме
а где НЕ В ИЕРАРХИИ? вот где жесть-то )
10. Aleksey.Bochkov 3598 24.07.15 16:29 Сейчас в теме
(1) rozer,
На самом деле, такая же ситуация как в третьем примере. Избавление от "В ИЕРАРХИИ" несколько улучшит ситуацию.
2. pbazeliuk 1921 24.07.15 14:08 Сейчас в теме
1. На перед, не известно какой план запроса получится
2. Логику кэширования лучше оставить. У нашей организации бывают пользователи что 14 дней базу не закрывали, и так же обработки. Регламентные работы 1 раз в 14 дней, максимально сеансов бывает и до 600, максимальных соединений до 200.
1,4. Такие запросы признак проблем с проектированием
11. Aleksey.Bochkov 3598 24.07.15 16:34 Сейчас в теме
(2) pbazeliuk,
1. На перед, не известно какой план запроса получится

Вполне известно - получается лучше.

2. Логику кэширования лучше оставить. У нашей организации бывают пользователи что 14 дней базу не закрывали, и так же обработки. Регламентные работы 1 раз в 14 дней, максимально сеансов бывает и до 600, максимальных соединений до 200.

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

1,4. Такие запросы признак проблем с проектированием

Каким вы видите оптимальное архитектурное решение в обоих случаях?
3. Гость 24.07.15 14:50
Пример 1 ("Запрос можно преобразовать в декларативном стиле") - плохо!
Надо так:
ВЫБРАТЬ
Р.Ссылка,
Р.Контрагент,
Р.Склад,
ЕСТЬNULL(Х.Признак, ЛОЖЬ) КАК ЕстьСФ
ИЗ
Документ.РеализацияТоваровУслуг КАК Р
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
ИСТИНА КАК Признак,
Х.ДокументОснование КАК ДокументОснование
ИЗ
Документ.СчетФактураВыданный КАК Х) КАК Х
ПО Р.Ссылка = Х.ДокументОснование
5. Nefertary 161 24.07.15 15:49 Сейчас в теме
(3) true SQL DBA,
ну если еще глубже посмотреть, то СГРУППИРОВАТЬ ПО оптимальнее чем ВЫБРАТЬ РАЗЛИЧНЫЕ
39. nvv1970 28.04.19 08:46 Сейчас в теме
(5) всегда было интересно чем, если план будет абсолютно одинаковый.
9. Aleksey.Bochkov 3598 24.07.15 16:27 Сейчас в теме
(3) true SQL DBA,
незачет :).
Во вложенной таблице выборка без фильтра.
Даже визуально видна значительно более медленная работа при обновлении динамического списка.
А план запроса покажет перебор большого числа записей из счет-фактур.
16. Гость 24.07.15 19:09
(9)
незачет :).
Во вложенной таблице выборка без фильтра.
Даже визуально видна значительно более медленная работа при обновлении динамического списка.
А план запроса покажет перебор большого числа записей из счет-фактур.

Все равно плохо!
Мой запрос работает быстрее, а тот, который вы оптимизируете (с группировками) - еще быстрее!!!
(5) Nefertary - вы правы.
Во вложении картинка с замерами производительности и обработка, с помощью которой они получены (для БП 3.0).

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

Хороших выходных!
Прикрепленные файлы:
ЗапросыСписка.epf
andrew87; +1 Ответить
17. Aleksey.Bochkov 3598 24.07.15 19:58 Сейчас в теме
(16) true SQL DBA,
Так проводить замеры совсем некорректно.
Это как раз и есть решение "в-лоб".
Вы не учли особенности динамического списка - данные выбираются порциями (к тексту запроса добавляется выборка первых записей "ПЕРВЫЕ N", в условие добавляется граничная ссылка на объект и добавляется сортировка). Т.е. фактически платформа выполняет другой запрос.
Создайте динамические списки на основе этих запросов и снимите трассировку через MSSQL Profiler.

Похоже надо расширить статью и показать планы запросов с пояснениями.. не хотелось перегружать на самом деле.
amaksimov; stal76; Трактор; kuntashov; +4 Ответить
29. bulpi 208 08.09.15 19:10 Сейчас в теме
(3) true SQL DBA,

Запрос, ИМХО, неверный
1)Использование слова РАЗЛИЧНЫЕ во вложенном запросе не оправдано
2)Его нужно использовать в основном запросе, иначе записи не будут уникальными в случае >1 счета-фактуры на 1 реализацию.

ВЫБРАТЬ РАЗЛИЧНЫЕ
Р.Ссылка,
Р.Контрагент,
Р.Склад,
ЕСТЬNULL(Х.Признак, ЛОЖЬ) КАК ЕстьСФ
ИЗ
Документ.РеализацияТоваровУслуг КАК Р
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ 
ИСТИНА КАК Признак,
Х.ДокументОснование КАК ДокументОснование
ИЗ
Документ.СчетФактураВыданный КАК Х) КАК Х
ПО Р.Ссылка = Х.ДокументОснование
Показать
30. nvv1970 13.09.15 21:58 Сейчас в теме
(29) bulpi,
На самом деле в данном случае различные во вложенном запросе обеспечивает уникальность поля ссылка в основном.
Поле признак избыточно, т.к. можно выводить поле (НЕ x.ДокументОснование есть NULL)
4. vasyak319 144 24.07.15 15:03 Сейчас в теме
Хаус + запросы = ildarovich

Лучше смените иллюстрацию, а то складывается негативное впечатление, будто вы товарный знак стырили.
Я не говорю, что вы так и сделали, но впечатление складывается.
lextor; YuriFm; dj_serega; ditp; +4 Ответить
8. Aleksey.Bochkov 3598 24.07.15 16:17 Сейчас в теме
(4) vasyak319,
Эх.. на выбор картинки ушло больше времени, чем на написание текста :).
Поменял.
6. vandalsvq 1236 24.07.15 16:08 Сейчас в теме
Предпочитаю регистры сведений с доп. данными для отдельно взятых случаев (вроде 1 и 4), при этом запись в эти регистры стараюсь делать в фоновых заданиях.
В случаях 2 и 3 обычно как параметр не ставлю в запрос, а накладываю отбор.
rpgshnik; Nite; +2 Ответить
13. Aleksey.Bochkov 3598 24.07.15 16:57 Сейчас в теме
(6) vandalsvq,
Предпочитаю регистры сведений с доп. данными для отдельно взятых случаев (вроде 1 и 4), при этом запись в эти регистры стараюсь делать в фоновых заданиях.

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

В случаях 2 и 3 обычно как параметр не ставлю в запрос, а накладываю отбор.

На самом деле, точно такая же ситуация - если делать отбор "В ГРУППЕ", то при каждом обновлении динамического списка будет происходить выборка иерархии.
Выбрав иерархию самостоятельно и передав массив объектов в отбор просто с видом сравнения "В СПИСКЕ" можно ускорить обновление динамического списка.
18. vandalsvq 1236 24.07.15 21:03 Сейчас в теме
(13)
На самом деле, точно такая же ситуация - если делать отбор "В ГРУППЕ", то при каждом обновлении динамического списка будет происходить выборка иерархии.

Ты меня малость не понял, список элементов формирую как и ты писал, до передачи в отбор. Просто вместо параметра отбор "В СПИСКЕ".

Информация обновляется оперативнее, да и сложность реализации меньшая.

Вопрос что мы записываем туда, реквизиты из объекта, согласен, накладных копейки. А если делаем пересчет статистических показателей - лучше уж в фон. Тем более с использованием БСП проблем никаких, пишешь "правильно" процедуру, тестируешь без фона, потом просто обертку из ДлительныеОперации делаешь и все.

к тексту запроса добавляется выборка первых записей "ПЕРВЫЕ N", в условие добавляется граничная ссылка на объект и добавляется сортировка

Насколько я осведомлен, ПЕРВЫЕ n будут выбираться только если порционное (динамическое) чтение данных стоит, а оно будет если у списка платформа может определить ключ. В свою очередь это относится только к запросам на основании объектов метаданных.

Оффтоп: в этом плане в 1С++ (на 7.7) динамические списки были намного шире, их можно было наполнять собственным запросом при условии установки уникального ключа. Т.е. не было большой необходимости привязываться к метаданным.
JohnyDeath; +1 Ответить
19. Aleksey.Bochkov 3598 24.07.15 22:35 Сейчас в теме
(18) vandalsvq,
Да, согласен по тому, что ты написал.

Насколько я осведомлен, ПЕРВЫЕ n будут выбираться только если порционное (динамическое) чтение данных стоит, а оно будет если у списка платформа может определить ключ.

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

В свою очередь это относится только к запросам на основании объектов метаданных.

Честно говоря, я не помню, чтобы в динамическом списке можно было определить запрос не на основании метаданных. Что имелось в виду?
20. vandalsvq 1236 25.07.15 00:30 Сейчас в теме
(19)
Честно говоря, я не помню, чтобы в динамическом списке можно было определить запрос не на основании метаданных. Что имелось в виду?

Имел в виду указывать или нет основную таблицу в форме редактирования запроса динамического списка.
7. vasyak319 144 24.07.15 16:17 Сейчас в теме
А вы уверены, что Пример 1 работоспособен? А то 1С утверждает, что когерентные запросы возможны только в секции "ГДЕ" и мои попытки игнорировать это утверждение всегда натыкались на то, что оно оказывалось верным.

Пример 2: можно просто переписать условие как "Р.Склад В (срез последних)" и никаких тебе соединений таблиц с одной стороны и никаких необходимостей переоткрывать форму - с другой.

Пример 3: А вы смотрели в SQL профайлере, как 1С преобразует конструкцию "В ИЕРАРХИИ"? Я, если что, сам не смотрел, но там по-любому должно быть что-то своё, одинэсовское, потому что SQL про группы не в курсе и без такого анализа ценность вашего предложения нулевая. Вполне возможно, что сервер 1С сам делает преобразование, аналогичное предложенному вами, так что ваш способ будет тормозить даже сильнее, потому что у вас два обращения к серверу вместо одного и передача списка ссылок вместо одной.

Пример 4: "Как мне кажется"
В таких случах надо смотреть план запроса, иначе это не оптимизация, а гадание.
12. Aleksey.Bochkov 3598 24.07.15 16:45 Сейчас в теме
(7) vasyak319,

А вы уверены, что Пример 1 работоспособен? А то 1С утверждает, что когерентные запросы возможны только в секции "ГДЕ" и мои попытки игнорировать это утверждение всегда натыкались на то, что оно оказывалось верным.

Данный пример вполне работоспособный.

Пример 2: можно просто переписать условие как "Р.Склад В (срез последних)" и никаких тебе соединений таблиц с одной стороны и никаких необходимостей переоткрывать форму - с другой.

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

Пример 3: А вы смотрели в SQL профайлере, как 1С преобразует конструкцию "В ИЕРАРХИИ"? Я, если что, сам не смотрел, но там по-любому должно быть что-то своё, одинэсовское, потому что SQL про группы не в курсе и без такого анализа ценность вашего предложения нулевая.

Все четыре примера успешно опробованы не раз на разных базах. "В ИЕРАРХИИ" - это запрос в цикле.

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

Вы не обладаете информацией, а делаете далеко идущие выводы.. проверить то не сложно :).
Не делает он такого преобразования, и обращений к серверу СУБД в моем случае получается меньше.

Пример 4: "Как мне кажется"
В таких случах надо смотреть план запроса, иначе это не оптимизация, а гадание.

Решить эту задачу можно разными способами. Фраза "как мне кажется" отражает мое личное мнение, основанное на практическом опыте, относительно эффективности подхода с кешированием в промежуточных таблицах в сравнении с другими вариантами. Тут даже планы запросов не надо смотреть, чтобы увидеть более эффективный вариант.
Кстати, в типовом Документообороте подход с кэшированием успешно применяется для ряда объектов.
14. vasyak319 144 24.07.15 16:59 Сейчас в теме
(12)
Тут даже планы запросов не надо смотреть, чтобы увидеть более эффективный вариант


Да нет, надо. Иногда преобразование запроса, которое вроде бы должно только добавить тормозов, уменьшает время его выполнения на порядок-другой. И даже глядя на результат не понимаешь, почему так. А ответ в плане запроса.
ojiojiowka; +1 Ответить
15. ivanov660 3626 24.07.15 18:48 Сейчас в теме
По пункту 4.
Решение с созданием дополнительных таблиц следует использовать если подобная операция довольно частая и вносит "определенную нагрузку".
21. RustIG 25.07.15 07:39 Сейчас в теме
(0) в чем преимущества использования динамических списков в сравнении с использованием АРМ разработанным на обычных неуправляемых формах?
делали замеры производительности использования динамических списков и использования списков обычных форм?
22. Aleksey.Bochkov 3598 25.07.15 22:28 Сейчас в теме
(21) Rustig,
Мне кажется, что сравнивать обычные формы списков и управлямые динамические формы списков нельзя. Слишком большая разница в доступном функционале.
При одинаковых условиях (выборка только из основной таблицы) оба механизма работают одинаково быстро.
Если нужен вывод данных из смежных таблиц - в общем случае, динамический список будет быстрее за счет выполнения одного запроса, т.к. в обычной форме уже нужно использовать процедуру "ПриПолученииДанных".
Плюс в динамическом списке у пользователей значительно больше свободы в настройке отборов, сортировок и т.д. При сложной настройке динамические списки могут работать медленно, но это не говорит о том, что обычные формы лучше. Там просто нельзя сделать аналогичные пользовательские настройки.
23. Kabz 77 25.07.15 22:29 Сейчас в теме
(21) Rustig, НЕ всегда возможно делать обычные списки (особенно когда конфигурация написана в такси :) )
24. sashapere 152 26.07.15 00:50 Сейчас в теме
Добрый день! можете подсказать какими инструментами делали анализ производительности запроса?
25. Aleksey.Bochkov 3598 26.07.15 01:15 Сейчас в теме
(24) sashapere,
SQL Server Profiler
http://infostart.ru/public/252236/
http://infostart.ru/public/291874/

Скрины планов запросов для большей наглядности сделал с помощью http://www.sqlsentry.com/products/plan-explorer/
nsirotkin@mail.ru; +1 Ответить
26. Mortiferus 359 29.07.15 09:15 Сейчас в теме
(25) последняя ссылка не работает.
27. Aleksey.Bochkov 3598 29.07.15 10:35 Сейчас в теме
(26) Mortiferus,
видимо, автор снял публикацию (там скрины были битые и я просил автора это поправить).
28. Aleksey.Bochkov 3598 08.09.15 13:34 Сейчас в теме
UPD. Добавил пятый пункт про опциональные отборы.
38. intehof 30.06.16 21:00 Сейчас в теме
(28) Направьте меня пожалуйста на опциональные функции компоновщика - где почитать?
Правильно ли понимаю для Примера 5: Если параметр "Автор комментария" не заполнен и поля второй таблицы заключены в фиг скобки то левого соединения не происходит?
Покажите пример где опционально поле второй таблицы (по параметру) не выводится и не происходит соединения.
31. nvv1970 13.09.15 22:10 Сейчас в теме
Предложенный пример #1 самый непроизводительный, причем к гигантским отрывом (медленнее в несколько сотен раз) Всех прочих. Подвисания дикие... до нескольких десятков секунд! Вычисление поля в цикле...
ВЫБРАТЬ
    Р.Ссылка,
    Р.Контрагент,
    Р.Склад,
    ВЫБОР
        КОГДА 1 В
                (ВЫБРАТЬ ПЕРВЫЕ 1
                    1
                ИЗ
                    Документ.СчетФактураВыданный КАК Х
                ГДЕ
                    Р.Ссылка = Х.ДокументОснование)
            ТОГДА ИСТИНА
        ИНАЧЕ ЛОЖЬ
    КОНЕЦ КАК ЕстьСФ
ИЗ
    Документ.РеализацияТоваровУслуг КАК Р
Показать
32. Aleksey.Bochkov 3598 14.09.15 02:42 Сейчас в теме
(31) nvv1970,
Об этом сказано в конце примера - данный запрос хорош ТОЛЬКО для динамического списка с динамическим считыванием данных.
33. Sergey.Noskov 1307 12.01.16 11:48 Сейчас в теме
При этом следует учесть, что в платформе есть определенное ограничение на количество параметров, передаваемых в запрос (256?).


если больше 128 элементов, то платформа будет создавать временную таблицу, причем индексированную
Aleksey.Bochkov; +1 Ответить
34. Fragster 1113 01.03.16 18:20 Сейчас в теме
Про пример 1. А как в таком случае будет работать отбор ДС по полю "признак"? не умрет ли он совсем по сравнению с левым соединением?
35. Fragster 1113 01.03.16 18:22 Сейчас в теме
Про пример 3. Проводили исследования про использование В ИЕРАРХИИ через доп РС с данными для nested sets?
36. tank68 17 24.03.16 10:22 Сейчас в теме
А в динамическом списке возможно ли отображать табличные части документа?
37. Infector 195 03.06.16 16:18 Сейчас в теме
На днях пришел к выводу, что есть ситуации, когда динамический список вообще стоит выкинуть, прицепить к форме таблицу значений и активнее использовать
Элементы.Таб.ОтборСтрок

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

См. также

Программные перечисления, ч.2: приемы кэширования при разработке Промо

Универсальные функции Механизмы платформы 1С Запросы Платформа 1С v8.3 Бесплатно (free)

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

30.10.2017    30121    unichkin    18    

Практическая шпаргалка по новым возможностям языка запросов 1С

Механизмы платформы 1С Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

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

21.11.2022    11415    quazare    32    

Особенность задания периода в запросе в СКД

СКД Запросы Платформа 1С v8.3 Запросы Система компоновки данных 1С:Бухгалтерия 3.0 Россия Бесплатно (free)

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

11.11.2022    1007    slicem    10    

Схема запроса: практические примеры использования

Запросы Платформа 1С v8.3 Запросы Бесплатно (free)

Учимся использовать схему запроса.

08.11.2022    3515    RocKeR_13    15    

Аналог PIVOT в запросе 1С (как выполнить транспонирование таблицы в запросе 1С) Промо

Запросы Платформа 1С v8.3 Бесплатно (free)

В статье показывается простой метод реализации аналога оператора PIVOT в запросе 1С без использования соединений.

12.12.2020    7719    Eugen-S    25    

Новые возможности языка запросов в платформе 8.3.20

Запросы Платформа 1С v8.3 Запросы Бесплатно (free)

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

27.09.2022    7015    zeltyr    17    

Партицированная дисциплина программиста в 1С

HighLoad оптимизация Механизмы платформы 1С Запросы Платформа 1С v8.3 Бесплатно (free)

Почему при росте объемов базы 1С все становится медленней, даже если все индексы правильно сделаны? В статье на простом примере с регистром сведений показана причина и как этого избежать. Кто виноват больше, 1С или MS SQL решать Вам :)

20.09.2022    1434    1CUnlimited    2    

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

Запросы Платформа 1С v8.3 Запросы Конфигурации 1cv8 Бесплатно (free)

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

01.06.2018    41765    m-rv    23    

Делаем свой интервальный регистр в ЗУП

Механизмы типовых конфигураций Запросы Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Бесплатно (free)

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

09.09.2022    1303    vazelin    4    

Ускорим проведение в 1С:Управление холдингом

HighLoad оптимизация Запросы Платформа 1С v8.3 1С:Управление холдингом Бесплатно (free)

В 1С:Управление холдингом есть "нехороший" запрос, который съедает значительную часть времени проведения документов. Если его подправить, то проведение заметно ускорится.

10.08.2022    4462    sapervodichka    60    

Порядковый номер в запросе. Нумерация строк в системе 1С

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

02.08.2022    1592    Koder_Line    10    

Выразить число как строку и дату как строку в запросе Промо

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

22.02.2015    144743    ildarovich    79    

Обход по группировкам в запросе, соединение таблиц, параметры в запросе, выгрузка прайс-листа в Excel, PDF, Docx, TXT

Запросы Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

В помощь начинающим программистам. Использую обработку из предыдущей моей публикации для разработки выгрузки Прайс-листа в Excel, PDF, Docx, TXT. Рассмотрю, как работает обход результата запроса ПоГруппировкам (релиз платформы 1С:Предприятие 8.3 (8.3.20.1674), самописная конфигурация).

18.07.2022    1504    Pproksima    2    

Экспертный кейс. История расследования одного небыстрого закрытия месяца в 1C:ERP. Пример неочевидных путей расследования в виде детективной истории

HighLoad оптимизация Механизмы платформы 1С Запросы Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

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

11.07.2022    4733    it-expertise    27    

Расчет хэш-функции в запросе Промо

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

20.03.2015    58855    ildarovich    39    

Кратность в Юанях (CNY) 10 и 1

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Обратите внимание на обмены данными с Юанями. Кратность там меняется между 10 и 1, в зависимости от значения курса > 10 или < 10. Т.е. НЕ ВСЕГДА равна 1. А многие разработчики (в том числе и я) грешат, ставя Кратность = 1 по умолчанию в обменах и выгрузках. P.S. Идём на Восток, становимся хитрее.

10.06.2022    6757    sapervodichka    12    

Экспертный кейс. Расследование фатального замедления времени расчета себестоимости в 1С:ERP 2

HighLoad оптимизация Механизмы типовых конфигураций Запросы Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

При выполнении нагрузочного тестирования информационной системы на базе 1С:ERP для одного из клиентов с целью оценки возможности миграции системы на PostgreSQL и Astra Linux мы столкнулись с неприемлемым увеличением времени выполнения расчета себестоимости. Строго говоря, сценарий тестирования закрытия месяца не был выполнен вообще – он не укладывался в таймаут выполнения теста, 24 часа. По прошествии 18 часов всё ещё шло выполнение операции «Распределение затрат и расчет себестоимости». Более 16 часов выполнялся подэтап “Расчет партий и себестоимости. Этап. Расчет себестоимости: РассчитатьСтоимость”. Всё это время выполнялся запрос, который в текущей инфраструктуре клиента (СУБД MS SQL Server) выполняется чуть более 3 минут на аналогичных данных.

25.03.2022    4843    it-expertise    92    

Экспертный кейс. Расследование деградации производительности системы. Проведение документа “Поступление товаров и услуг” (1С:ERP 2)

Механизмы платформы 1С Запросы HighLoad оптимизация Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

В ходе проведения нагрузочного тестирования одним из наших клиентов была выявлена сильная деградация производительности системы в целом и, в частности, выполнения ключевой операции “Проведение документа поступление товаров и услуг” в течение выполнения теста. Согласно данным подсистемы БСП “Оценка производительности”, время выполнения ключевой операции “Проведение документа поступление товаров и услуг” возрастало в процессе тестирования с 15-20 секунд в начале тестирования до 150-200 секунд в его финале.

02.03.2022    3603    it-expertise    47    

Распределение оплаты по товарам Промо

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Учебная задача. Оплата приходит по заказу. Требуется запросом распределить её по товарам. Практическая задача была сложнее. Упростил специально для иллюстрации. Сначала собираем в одну таблицу заказы и товары. Затем ОБЪЕДИНИТЬ ВСЕ с оплатами. Потом намазываем оплату на товар.

04.08.2014    20001    Трактор    4    

Задача по 1С - в базе данных есть таблица движения товара, пишем запрос для определения среднего значения остатка товара

Запросы Платформа 1С v8.3 Запросы Бесплатно (free)

В базе данных есть таблица движения товара, плюс означает, что товар пришел на склад, минус означает, что товар выбыл со склада: Необходимо написать запрос на 1С или SQL (по желанию), который вернет среднее значение остатка товара за январь 2021 (с 1 по 31). В результате должно получиться ProdID 1 = 1.58 ProdID 2 = 0.77

01.03.2022    1797    Greamdevil    3    

Исправляем ошибку расчета дней компенсации при увольнении в ЗУП 2.1 для Украины

Запросы Адаптация типовых решений Платформа 1С v8.3 Сложные периодические расчеты Конфигурации 1cv8 Украина Бухгалтерский учет Бесплатно (free)

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

14.02.2022    574    SnorkL1    0    

Генерация простых чисел в запросе (SQL) и сравнение производительности

Запросы Платформа 1С v8.3 Бесплатно (free)

Пишем запрос по генерацию последовательности простых чисел на языке запросов 1С и SQL.

09.01.2022    1238    AtamanovYS    0    

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

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

12.10.2014    95812    ekaruk    88    

Заметки по SQL 4: Преобразование в запросе строки в дату одним выражением

Запросы Платформа 1С v8.3 Россия Бесплатно (free)

На "Инфостарте" есть несколько статей, описывающих преобразование строки в дату. Описанное в них преобразование осуществляется в несколько запросов и имеет сложные для понимания выражения. В статье описано относительно простое выражение в запросе, преобразующее строку в дату.

10.12.2021    1459    IVC_goal    17    

Готовые механизмы 1С: ЗУП, представления

Механизмы типовых конфигураций Запросы Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Бухгалтерский учет Бесплатно (free)

Здесь будет храниться архив запросов, которые могут помочь разработчику правильно строить отчеты и получать данные в 1С: ЗУП. Статью буду периодически дополнять.

03.11.2021    5541    Margo462    19    

Работа с SQL. Шаблон общего модуля

Запросы Платформа 1С v8.3 Бесплатно (free)

Шаблон общего модуля для работы с MS/PG SQL из 1С.

21.10.2021    3713    mrChOP93    3    

Самоучитель языка запросов 1С. Промо

Запросы Платформа 1С v8.3 Запросы Бесплатно (free)

Сервис для изучения запросов 1С: "Консоль изучения запросов 1С:Предприятие 8". Теперь и с конструктором запросов!

07.05.2013    120961    bpc222    327    

Как читать чужой код? Часть 3. Разбор и доработка запросов

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Во всех вакансиях есть требование - умение читать чужой код. Но ни на одних курсах специально этому не учат. Чтобы устранить это противоречие, пишу данную статью. Рассмотрю случаи, в которых нам необходимо разбирать чужой код, поймём, чей код мы пытаемся разобрать, зачем и, главное, как. В статье описан личный опыт длиною в 18 лет начиная с версии платформы 7.7. Статья будет большой, набираемся терпения). Статья содержит в себе описание сценариев разбора кода, т.е. набор шагов. В статье не получится показать это на практике. Для этого планирую сделать онлайн или оффлайн курс, где на примерах будет показан разбор незнакомого кода. Статья разбита на 4 публикации для удобства изучения.

20.09.2021    4130    biimmap    32    

Еще один способ вычисления медианы запросом 1С

Запросы Платформа 1С v8.3 Платформа 1C v8.2 Бесплатно (free)

Вниманию сообщества предлагается еще один способ расчета медианы числового ряда одним пакетным запросом 1С.

09.08.2021    2051    direktorSan    0    

Временные таблицы запроса

Запросы Платформа 1С v8.3 8.3.14 Конфигурации 1cv8 Бесплатно (free)

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

30.07.2021    2217    KonanSS    3    

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

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Россия Бесплатно (free)

Понадобилось в запросе выполнить некоторые операции с датами: - посчитать дату оплаты в банковских днях; - собирать строки, в которые должны были входить даты, точнее строковые представления дат в формате "ДФ=dd.MM.yyyy". Вот что из этого получилось.

30.03.2010    67294    alexk-is    39    

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

Запросы Платформа 1С v8.3 Бесплатно (free)

Разберём решение задачи реального проекта: контекст, логика решения, само решение. Рассмотрим возможности объекта СхемаЗапроса.

03.06.2021    5297    maraton1185    32    

Последний раз про срез последних (на каждую дату в запросе)

Запросы Платформа 1С v8.3 Запросы Бесплатно (free)

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

15.02.2021    26168    randomus    47    

Разбиение запросом записей периодического регистра сведений по интервалам

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

22.12.2020    2215    Andrei_Ivanov    3    

Как удалить из выборки дубли по двум полям. Промо

Запросы Платформа 1С v8.3 Россия Бесплатно (free)

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

15.11.2013    21723    Petr54-ru    22    

Программное создание корректировочного счета-фактуры выданного в УПП 1.3

Математика и алгоритмы Механизмы типовых конфигураций Запросы Платформа 1С v8.3 1С:Управление производственным предприятием Россия Бухгалтерский учет НДС Бесплатно (free)

Данный функционал можно использовать, например, в процессе оформления возвратов от поставщика (корректировка реализации по согласованию сторон) при автоматическом создании корректировок реализации по документам поставщика, он позволяет массово создать корректировочные счета-фактуры в УПП 1.3. При создании документа из первичного счета-фактуры выданного в новый корректировочный счет-фактуру выданный копируются значения свойств.

17.12.2020    1051    ksnik    0    

Имитация sql выражения LIMIT в запросе 1С

Запросы Платформа 1С v8.3 Бесплатно (free)

Всем известно, что в SQL синтаксисе есть выражение LIMIT. Очень полезное выражение для постраничной навигации. Но его нет в запросах 1С. Кто-то может сказать, что есть ПЕРВЫЕ, но ПЕРВЫЕ не подходит для постраничной навигации. Рассмотрим в статье, как можно имитировать LIMIT в запросах 1С.

08.12.2020    2927    opx    51    

Итоги по объединенной совокупности группировок в запросе

Запросы Платформа 1С v8.3 Бесплатно (free)

Способ формирования итогов в запросе по совокупности группировок, объединенных в единый набор, при помощи функции АВТОНОМЕРЗАПИСИ.

18.11.2020    9828    antonivan    21    

Отрицательные страховые взносы Промо

Механизмы типовых конфигураций Запросы Адаптация типовых решений Платформа 1С v8.3 1С:Зарплата и кадры бюджетного учреждения Бесплатно (free)

Иногда возникает необходимость рассчитать страховые взносы с отрицательной базы, но типовая зарплата сделать этого не позволяет. Предлагаю пример изменения запросов на релизе ЗКБУ 1.0.47.2 и всё будет считаться. Проверено на больших бюджетных организациях.

30.10.2012    12803    Nowa    25    

Кадровые данные сотрудников ЗУП 3.1 в запросе

Запросы Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Бесплатно (free)

Получение кадровый данных сотрудников в запросе при помощи функции КадровыйУчет.СоздатьНаДатуВТКадровыеДанныеСотрудников().

26.10.2020    6145    Danila7Zz    4    

Полезные сведения о языке запросов 1С 8.2 Промо

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Украина Бесплатно (free)

В статье приведены полезные приемы при работе с запросами 1С v.8.2, а также сведения, которые не так хорошо известны о языке запросов. Я не стремлюсь дать полное описание языка запросов, а хочу остановиться лишь на некоторых моментах, которые для кого-то могут быть полезны.

10.12.2012    377391    fpat    84    

Учимся создавать http сервис (часть четвертая). Изучение метода POST http запроса (передача текстовых данных)

Запросы Платформа 1С v8.3 Бесплатно (free)

Пошаговое руководство по созданию http сервисов (часть четвертая). Изучение метода POST http запроса.

11.10.2020    28510    hpi    29    

Улучшенный конструктор запроса тонкого клиента (Infostart Toolkit)

Запросы Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

07.09.2020    8004    Evg-Lylyk    21    

Меры центральной тенденции (вычисление среднего) в запросе 1С

Запросы Платформа 1С v8.3 Бесплатно (free)

Меры центральной тенденции (вычисление среднего) в запросе 1С: * Среднее арифметическое * Среднее гармоническое * Среднее квадратическое * Среднее усеченное * Среднее винсоризованное * Медиана * Мода

31.08.2020    1987    parcan    6    

Проводим по БУ "на лету"

Инструментарий разработчика Запросы Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х Бухгалтерский учет Налоговый учет Бесплатно (free)

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

01.05.2020    8717    sapervodichka    1    

Поблочная обработка таблицы. Обзор решений

Универсальные функции Запросы СКД Платформа 1С v8.3 Бесплатно (free)

8 способов реализации повседневной актуальной задачи, готовый код

25.02.2020    3082    Yashazz    21    

Нечёткий поиск "ПОДОБНО". Нюансы

Запросы Платформа 1С v8.3 Бесплатно (free)

Заметки о "ПОДОБНО" в языке запросов

23.02.2020    50917    Yashazz    31