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

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

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

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

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

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

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

При написании текста запроса следует учитывать то, что при его исполнении в динамическом списке платформа модифицирует запрос - добавляется выбор порции данных ("ПЕРВЫЕ 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 279 24.07.15 11:57 Сейчас в теме
а где НЕ В ИЕРАРХИИ? вот где жесть-то )
10. Aleksey.Bochkov 3442 24.07.15 16:29 Сейчас в теме
(1) rozer,
На самом деле, такая же ситуация как в третьем примере. Избавление от "В ИЕРАРХИИ" несколько улучшит ситуацию.
2. pbazeliuk 1794 24.07.15 14:08 Сейчас в теме
1. На перед, не известно какой план запроса получится
2. Логику кэширования лучше оставить. У нашей организации бывают пользователи что 14 дней базу не закрывали, и так же обработки. Регламентные работы 1 раз в 14 дней, максимально сеансов бывает и до 600, максимальных соединений до 200.
1,4. Такие запросы признак проблем с проектированием
11. Aleksey.Bochkov 3442 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 150 24.07.15 15:49 Сейчас в теме
(3) true SQL DBA,
ну если еще глубже посмотреть, то СГРУППИРОВАТЬ ПО оптимальнее чем ВЫБРАТЬ РАЗЛИЧНЫЕ
39. nvv1970 28.04.19 08:46 Сейчас в теме
(5) всегда было интересно чем, если план будет абсолютно одинаковый.
9. Aleksey.Bochkov 3442 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 3442 24.07.15 19:58 Сейчас в теме
(16) true SQL DBA,
Так проводить замеры совсем некорректно.
Это как раз и есть решение "в-лоб".
Вы не учли особенности динамического списка - данные выбираются порциями (к тексту запроса добавляется выборка первых записей "ПЕРВЫЕ N", в условие добавляется граничная ссылка на объект и добавляется сортировка). Т.е. фактически платформа выполняет другой запрос.
Создайте динамические списки на основе этих запросов и снимите трассировку через MSSQL Profiler.

Похоже надо расширить статью и показать планы запросов с пояснениями.. не хотелось перегружать на самом деле.
amaksimov; stal76; Трактор; kuntashov; +4 Ответить
29. bulpi 179 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 141 24.07.15 15:03 Сейчас в теме
Хаус + запросы = ildarovich

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


Да нет, надо. Иногда преобразование запроса, которое вроде бы должно только добавить тормозов, уменьшает время его выполнения на порядок-другой. И даже глядя на результат не понимаешь, почему так. А ответ в плане запроса.
ojiojiowka; +1 Ответить
15. ivanov660 2385 24.07.15 18:48 Сейчас в теме
По пункту 4.
Решение с созданием дополнительных таблиц следует использовать если подобная операция довольно частая и вносит "определенную нагрузку".
21. Rustig 1669 25.07.15 07:39 Сейчас в теме
(0) в чем преимущества использования динамических списков в сравнении с использованием АРМ разработанным на обычных неуправляемых формах?
делали замеры производительности использования динамических списков и использования списков обычных форм?
22. Aleksey.Bochkov 3442 25.07.15 22:28 Сейчас в теме
(21) Rustig,
Мне кажется, что сравнивать обычные формы списков и управлямые динамические формы списков нельзя. Слишком большая разница в доступном функционале.
При одинаковых условиях (выборка только из основной таблицы) оба механизма работают одинаково быстро.
Если нужен вывод данных из смежных таблиц - в общем случае, динамический список будет быстрее за счет выполнения одного запроса, т.к. в обычной форме уже нужно использовать процедуру "ПриПолученииДанных".
Плюс в динамическом списке у пользователей значительно больше свободы в настройке отборов, сортировок и т.д. При сложной настройке динамические списки могут работать медленно, но это не говорит о том, что обычные формы лучше. Там просто нельзя сделать аналогичные пользовательские настройки.
23. Kabz 76 25.07.15 22:29 Сейчас в теме
(21) Rustig, НЕ всегда возможно делать обычные списки (особенно когда конфигурация написана в такси :) )
24. sashapere 150 26.07.15 00:50 Сейчас в теме
Добрый день! можете подсказать какими инструментами делали анализ производительности запроса?
25. Aleksey.Bochkov 3442 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 341 29.07.15 09:15 Сейчас в теме
(25) последняя ссылка не работает.
27. Aleksey.Bochkov 3442 29.07.15 10:35 Сейчас в теме
(26) Mortiferus,
видимо, автор снял публикацию (там скрины были битые и я просил автора это поправить).
28. Aleksey.Bochkov 3442 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 3442 14.09.15 02:42 Сейчас в теме
(31) nvv1970,
Об этом сказано в конце примера - данный запрос хорош ТОЛЬКО для динамического списка с динамическим считыванием данных.
33. Sergey.Noskov 1179 12.01.16 11:48 Сейчас в теме
При этом следует учесть, что в платформе есть определенное ограничение на количество параметров, передаваемых в запрос (256?).


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

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

См. также

Serverless (Faas) в 1С. Создание и вызов Yandex Cloud Functions Промо

Универсальные функции Практика программирования v8 Бесплатно (free)

"Я не могу просто взять и скопировать код с гитхаба", "у нас 1С микросервисами окружена", "возможностей мало" - частые фразы 1С разработчиков. которым не хватает возможностей платформы в современном мире. Faas, конечно, история не новая, но нас сдерживало 152ФЗ и задержки по пингам. Для того, чтобы действительно использовать в 1С код, к примеру, на Python, надо было приложить усилия. Теперь всё намного проще - берём и используем.

28.12.2020    4455    comol    22    

Базовые вещи БСП, которые облегчат жизнь программисту 1С

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

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

30.08.2020    11035    quazare    33    

Форма выбора (подбор) в управляемых формах

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

Разбор небольших примеров того, как правильно открывать форму выбора (подбора) в управляемых формах, не прибегая к модальным окнам.

08.05.2020    36254    user5300    16    

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

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

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

27.01.2020    39490    ids79    26    

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

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

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

10.12.2016    38475    unichkin    74    

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

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

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

15.01.2020    30696    John_d    22    

Последовательности событий при проведении документа 1С. Шпаргалка + про формы + про расширения

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

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

30.12.2019    23380    kuzyara    38    

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

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

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

02.12.2019    18887    YPermitin    60    

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

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

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

15.10.2018    32090    tormozit    104    

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

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

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

22.11.2019    9875    Sibars    19    

Полезные процедуры и функции для программиста

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

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

07.10.2019    33258    HostHost    41    

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

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

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

01.10.2019    40392    Yashazz    50    

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

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

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

20.09.2012    79338    tormozit    131    

О программе Postman для тестирования API и для чего она нужна 1С-нику

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

Для чего нужна программа Postman для тестирования API и какая от него польза для 1С-программиста.

24.09.2019    14659    budidich    28    

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

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

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

06.09.2019    67800    rpgshnik    68    

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

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

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

05.09.2019    58515    ids79    55    

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

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

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

11.07.2007    50107    tormozit    48    

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

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

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

05.09.2019    33361    YPermitin    24    

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

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

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

03.09.2019    27088    YPermitin    80    

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

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

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

17.08.2019    35522    ids79    16    

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

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

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

10.09.2017    46806    tormozit    74    

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

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

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

08.08.2019    107629    ids79    63    

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

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

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

02.08.2019    44212    avalakh    26    

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

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

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

31.07.2019    29384    json    15    

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

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

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

25.04.2019    16434    m-rv    2    

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

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

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

26.07.2019    76473    ids79    14    

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

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

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

17.07.2019    40023    ids79    27    

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

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

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

09.07.2019    28428    YPermitin    14    

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

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

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

16.04.2019    20972    m-rv    17    

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

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

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

04.07.2019    20415    SeiOkami    50    

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

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

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

02.07.2019    59657    ids79    17    

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

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

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

25.06.2019    60607    ids79    26    

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

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

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

01.06.2018    32352    m-rv    21    

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

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

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

11.06.2019    27063    dmurk    146    

Регистры накопления. Виртуальные таблицы. Часть №2: "Остатки" и "Остатки и обороты"

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

Описание работы платформы 1С:Предприятие 8.2 с виртуальными таблицами регистров накопления "Остатки" и "Остатки и обороты". Анализ SQL-запрос при работе с виртуальными таблицами

22.05.2019    31897    YPermitin    7    

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

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

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

16.05.2019    49867    YPermitin    30    

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

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

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

05.12.2017    28860    itriot11    34    

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

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

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

07.04.2019    37933    ellavs    126    

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

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

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

28.03.2019    28654    ellavs    90    

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

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

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

14.03.2019    34573    YPermitin    53    

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

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

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

27.01.2016    78432    Serginio    113    

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

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

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

01.03.2019    48775    Смешной 1С    31    

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

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

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

26.02.2019    24208    Vladimir Litvinenko    28    

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

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

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

10.11.2018    37460    ids79    40    

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

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

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

03.02.2019    46548    ids79    11    

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

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

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

25.07.2018    30156    grumagargler    31    

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

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

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

26.12.2018    29044    ids79    31