Баттерфляй - метод быстрого расчета нарастающего итога в запросе

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

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

нарастающий итог запрос быстрый метод

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

Введение

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

Сложность расчета нарастающего итога в запросах обусловлена реляционной природой СУБД, хранящей исходные данные и результаты вычислений. Записи одной и той же таблицы принципиально не связаны между собой, что и порождает проблему их последовательного суммирования в процессе расчета нарастающего итога. О том, что проблема затрагивает не только решения на основе платформы «1С: Предприятие», можно судить по работе[Нарастающий итог сравнение производительности].

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

ВЫБРАТЬ
	СУММА(ДоДано.Сумма) КАК Сумма
ИЗ
	Дано КАК Дано
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Дано КАК ДоДано
		ПО Дано.НомерСтроки >= ДоДано.НомерСтроки
СГРУППИРОВАТЬ ПО
	Дано.НомерСтроки

При использовании приведенного запроса расчет по каждой строке делается независимо от результатов расчетов других строк. Это порождает проблему быстродействия данного подхода, так как число элементарных операций, а в итоге и затраты времени оказываются пропорциональными половине квадрата числа строк исходной таблицы. То есть при увеличении числа строк в таблице в десять раз, время расчета увеличивается в сто раз! О квадратичной зависимости свидетельствует следующая схема расчета нарастающего итога в таблице из восьми элементов Фиг.0.

Дано\ДоДано 1 1 1 1 1 1 1 1 Сумма
1 1               1
1 1 1             2
1 1 1 1           3
1 1 1 1 1         4
1 1 1 1 1 1       5
1 1 1 1 1 1 1     6
1 1 1 1 1 1 1 1   7
1 1 1 1 1 1 1 1 1 8

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

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

Описание метода

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

Скема

Первоначально исходная таблица помещается в таблицу «Л1» на левом крыле бабочки. Затем, в соответствии со схемой, производится попарное суммирование соседних строк таблицы «Л1», а результат помещается в таблицу «Л2» из четырех строк. Аналогично по таблице «Л2» строится таблица «Л4», а по «Л4» – таблица «Л8», состоящая по понятным причинам из одной строки. На правом крыле производятся чуть более сложные действия. Единственная строка таблицы «Л8» расщепляется на две строки таблицы «П4». Для этого используется искусственная таблица «Р0», состоящая из двух строк: одна с нулем и другая с единицей. Кроме того (и в этом весь фокус), из верхней строки таблицы «П4» вычитается нижняя строка таблицы «Л4». Это делается затем, чтобы суммы, накопленные в элементе «Л4», не входили в нарастающий итог для строк с меньшим номером. Далее каждая строка таблицы «П4» опять расщепляется на две строки таблицы «П2», а из строк 1, 3 (с нечетными номерами) вычитаются соответствующие строки 2, 4 таблицы «Л2». Ну, и наконец,  строится таблица «П1» расщеплением на две строки каждой строки «П2». При этом и строк 1, 3, 5, 7 вычитаются строки 2, 4, 6, 8 таблицы Л1.

Последовательность получаемых таблиц приведена на фиг.2.

НомерСтроки\Таблица Л1 Л2 Л4 Л8 П4 П2 П1
1 1 2 4 8 4 2 1
2 1 2 4   8 4 2
3 1 2       6 3
4 1 2       8 4
5 1           5
6 1           6
7 1           7
8 1           8

 

Для удобства записи и экономии памяти в запросе таблицы правого крыла «П» сразу же после использования удаляются, а таблицы левого крыла «Л» – переформировываются и тоже удаляются.

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

ВЫБРАТЬ
	ВЫРАЗИТЬ(Л#1.ё / 2 КАК ЧИСЛО(10, 0)) КАК ё,
	СУММА(Л#1.Сумма) КАК Сумма
ПОМЕСТИТЬ Л#2
ИЗ
	Л#1 КАК Л#1
СГРУППИРОВАТЬ ПО
	ВЫРАЗИТЬ(Л#1.ё / 2 КАК ЧИСЛО(10, 0))

А вот текст рефрена для правого крыла

ВЫБРАТЬ
	2 * Л2.ё - Р0.е КАК ё,
	Л2.Сумма
ПОМЕСТИТЬ П#1
ИЗ
	Л#2 КАК Л2,
	Р0 КАК Р0
ГДЕ
	2 * Л2.ё - Р0.е < = &ЧислоСтрок

ОБЪЕДИНИТЬ

ВЫБРАТЬ
	Л1.ё - 1,
	-Л1.Сумма
ИЗ
	Л#1 КАК Л1
ГДЕ
	(ВЫРАЗИТЬ(Л1.ё / 2 КАК ЧИСЛО(10, 0))) = Л1.ё / 2
;
УНИЧТОЖИТЬ Л#1
;
ВЫБРАТЬ
	П1.ё,
	СУММА(П1.Сумма) КАК Сумма
ПОМЕСТИТЬ Л1
ИЗ
	П#1 КАК П1

СГРУППИРОВАТЬ ПО
	П1.ё
;
УНИЧТОЖИТЬ П#1

Для восьми строк весь запрос имеет вид

ВЫБРАТЬ 0 КАК е ПОМЕСТИТЬ Р0 ОБЪЕДИНИТЬ ВЫБРАТЬ 1;
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК Число(10,0))ё,Сумма(Сумма)Сумма ПОМЕСТИТЬ Л2 ИЗ Л1 СГРУППИРОВАТЬ ПО ВЫРАЗИТЬ(ё/2 КАК Число(10,0));
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК Число(10,0))ё,Сумма(Сумма)Сумма ПОМЕСТИТЬ Л4 ИЗ Л2 СГРУППИРОВАТЬ ПО ВЫРАЗИТЬ(ё/2 КАК Число(10,0));
ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК Число(10,0))ё,Сумма(Сумма)Сумма ПОМЕСТИТЬ Л8 ИЗ Л4 СГРУППИРОВАТЬ ПО ВЫРАЗИТЬ(ё/2 КАК Число(10,0));
ВЫБРАТЬ 2*ё-е ё,Сумма ПОМЕСТИТЬ П4 ИЗ Л8,Р0 ГДЕ 2*ё-е< =&ЧислоСтрок ОБЪЕДИНИТЬ ВЫБРАТЬ ё-1,-Сумма ИЗ Л4 ГДЕ ВЫРАЗИТЬ(ё/2 КАК Число(10,0))=ё/2;
УНИЧТОЖИТЬ Л4;ВЫБРАТЬ ё,СУММА(Сумма)Сумма ПОМЕСТИТЬ Л4 ИЗ П4 СГРУППИРОВАТЬ ПО ё;
УНИЧТОЖИТЬ П4;
ВЫБРАТЬ 2*ё-е ё,Сумма ПОМЕСТИТЬ П2 ИЗ Л4,Р0 ГДЕ 2*ё-е< =&ЧислоСтрок ОБЪЕДИНИТЬ ВЫБРАТЬ ё-1,-Сумма ИЗ Л2 ГДЕ ВЫРАЗИТЬ(ё/2 КАК Число(10,0))=ё/2;
УНИЧТОЖИТЬ Л2;
ВЫБРАТЬ ё,СУММА(Сумма)Сумма ПОМЕСТИТЬ Л2 ИЗ П2 СГРУППИРОВАТЬ ПО ё;
УНИЧТОЖИТЬ П2;
ВЫБРАТЬ 2*ё-е ё,Сумма ПОМЕСТИТЬ П1 ИЗ Л2,Р0 ГДЕ 2*ё-е< =&ЧислоСтрок ОБЪЕДИНИТЬ ВЫБРАТЬ ё-1,-Сумма ИЗ Л1 ГДЕ ВЫРАЗИТЬ(ё/2 КАК Число(10,0))=ё/2;
УНИЧТОЖИТЬ Л1;
ВЫБРАТЬ ё,СУММА(Сумма)Сумма ПОМЕСТИТЬ Л1 ИЗ П1 СГРУППИРОВАТЬ ПО ё;
УНИЧТОЖИТЬ П1;

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

Функция ТекстЗапросаБаттерфляй_(ЧислоСтрок)
	ТекстЗапроса = "ВЫБРАТЬ 0 КАК е ПОМЕСТИТЬ Р0 ОБЪЕДИНИТЬ ВЫБРАТЬ 1;";
	РефренКрылаЛ = "ВЫБРАТЬ ВЫРАЗИТЬ(ё/2 КАК Число(10,0))ё,Сумма(а)а ПОМЕСТИТЬ Л#2 ИЗ Л#1 СГРУППИРОВАТЬ ПО ВЫРАЗИТЬ(ё/2 КАК Число(10,0));";
	РефренКрылаП = "ВЫБРАТЬ 2*ё-е ё,а ПОМЕСТИТЬ П#1 ИЗ Л#2,Р0 ГДЕ 2*ё-е< =&ЧислоСтрок ОБЪЕДИНИТЬ ВЫБРАТЬ ё-1,-а ИЗ Л#1 ГДЕ ВЫРАЗИТЬ(ё/2 КАК Число(10,0))=ё/2;
				   |УНИЧТОЖИТЬ Л#1;ВЫБРАТЬ ё,СУММА(а)а ПОМЕСТИТЬ Л#1 ИЗ П#1 СГРУППИРОВАТЬ ПО ё; УНИЧТОЖИТЬ П#1;";
	Охват = 1;
	Пока Охват < ЧислоСтрок Цикл
		ТекстЗапроса = ТекстЗапроса + СтрЗаменить(СтрЗаменить(РефренКрылаЛ, "#2", "" + Формат(Охват * 2, "ЧГ=0")), "#1", Формат(Охват, "ЧГ=0"));
		Охват = Охват * 2;
	КонецЦикла;
	Пока Охват > 1 Цикл
		ТекстЗапроса = ТекстЗапроса + СтрЗаменить(СтрЗаменить(РефренКрылаП, "#2", Формат(Охват, "ЧГ=0")), "#1", Формат(Охват / 2, "ЧГ=0"));
		Охват = Охват / 2
	КонецЦикла;
	Возврат ТекстЗапроса
КонецФункции

Нетрудно заметить, что общее число всех выполняемых операций на фиг.1 пропорционально 4,5 N (!!!), где N – число строк в исходной таблице. Это существенно меньше, чем 0,5 N^2. Отсюда и высокая эффективность метода. Притом, что все выполняемые операции делаются с помощью низкозатратной операции группировки.

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

Фиг.3

и базы на основе MSSQL (фиг.4)

Фиг.4  

Видно, что в файловом варианте стандартный метод проигрывает методу «баттерфляй» уже начиная с 200 строк, а в SQL-варианте – начиная с 2000 строк.

Чтобы можно было самостоятельно проверить приведенные данные, к статье приложена обработка. Она позволяет сформировать таблицу из нужного числа строк и проверить время расчета нарастающего итога разными методами. Метод 0 в обработке – получение нарастающего итога в коде,  метод 1 – с помощью стандартного запроса "Треугольником", метод 2 – запроса «Баттерфляй».

Где это можно использовать на практике?

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

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

Функция ТекстЗапросаБаттерфляй(ЧислоСтрок)
	ТекстЗапроса = "ВЫБРАТЬ 0 КАК е ПОМЕСТИТЬ Р0 ОБЪЕДИНИТЬ ВЫБРАТЬ 1;";
	РефренКрылаЛ = "ВЫБРАТЬ э,ВЫРАЗИТЬ(ё/2 КАК Число(10,0))ё,Сумма(а)а ПОМЕСТИТЬ Л#2 ИЗ Л#1 СГРУППИРОВАТЬ ПО э,ВЫРАЗИТЬ(ё/2 КАК Число(10,0));";
	РефренКрылаП = "ВЫБРАТЬ э,2*ё-е ё,а ПОМЕСТИТЬ П#1 ИЗ Л#2,Р0 ГДЕ 2*ё-е< =&ЧислоСтрок ОБЪЕДИНИТЬ ВЫБРАТЬ э,ё-1,-а ИЗ Л#1 ГДЕ ВЫРАЗИТЬ(ё/2 КАК Число(10,0))=ё/2;
				   |УНИЧТОЖИТЬ Л#1;ВЫБРАТЬ э,ё,СУММА(а)а ПОМЕСТИТЬ Л#1 ИЗ П#1 СГРУППИРОВАТЬ ПО э,ё; УНИЧТОЖИТЬ П#1;";
	Охват = 1;
	Пока Охват < ЧислоСтрок Цикл
		ТекстЗапроса = ТекстЗапроса + СтрЗаменить(СтрЗаменить(РефренКрылаЛ, "#2", "" + Формат(Охват * 2, "ЧГ=0")), "#1", Формат(Охват, "ЧГ=0"));
		Охват = Охват * 2;
	КонецЦикла;
	Пока Охват > 1 Цикл
		ТекстЗапроса = ТекстЗапроса + СтрЗаменить(СтрЗаменить(РефренКрылаП, "#2", Формат(Охват, "ЧГ=0")), "#1", Формат(Охват / 2, "ЧГ=0"));
		Охват = Охват / 2
	КонецЦикла;
	Возврат ТекстЗапроса
КонецФункции

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

ВЫБРАТЬ
	1 КАК ё,
	Остатки.Номенклатура КАК э,
	Остатки.КоличествоОстаток КАК а
ПОМЕСТИТЬ Л1
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Остатки(&НачалоПериода, ) КАК Остатки

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

ВЫБРАТЬ
	РАЗНОСТЬДАТ(&НачалоПериода, Обороты.Период, ДЕНЬ) + 2,
	Обороты.Номенклатура,
	Обороты.КоличествоОборот
ИЗ
	РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, ДЕНЬ, ) КАК Обороты
;
ВЫБРАТЬ
	ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, Л1.ё - 1) КАК Период,
	Л1.э КАК Номенклатура,
	Л1.а КАК Остаток
ИЗ
	Л1 КАК Л1
ГДЕ
	ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, Л1.ё - 1) < = &КонецПериода

Слово "День" при компоновке результата заменяется на интересующий нас период.

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

К статье приложена обработка, содержащая данное решение.

Вторым примером может быть задача агрегатной конкатенации строк в запросе [Агрегатная конкатенация строк в запросе - сложно, но не невозможно]: на одном из этапов там требуется определить порядковый номер отдельного символа в общей последовательности. При определении номера стандартным методом эта операция выполняется долго, а если применить схему "баттерфляй", метод агрегатной конкатенации сможет соперничать по быстродействию с внезапросными способами, то есть станет достаточно практичным (хотя и еще более громоздким).
 
Третьим примером может быть задача последовательной нумерации документов по времени. На входе при этом будет таблица с номером секунды документа, а на выходе - порядковый номер документа в последовательности.
Другие возможные примеры применения метода пока не готовы для демонстрации или не разработаны или еще неизвестны.

Заключение

В заключение необходимо еще раз обратить внимание и подчеркнуть тот факт, что найденный метод получения нарастающего итога в запросе имеет минимально возможную трудоемкость О(N) /***/. То есть трудоемкость метода фактически (с точностью до коэффициента) равна трудоемкости получения нарастающих итогов  в коде. Ну и, кроме того, данное решение является чисто алгоритмическим. Оно не привязано жестко к особенностям языка запросов 1С. Поэтому с таким же успехом может использоваться и при решении задачи получения нарастающих итогов, например, непосредственно на языке T-SQL.   

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

Примечания

*/  Интересно, что вычисление нарастающего итога по сути – это задача численного интегрирования функции, заданной исходной таблицей.

**/  Довольно часто получение остатков на каждый день используется в задаче определения среднедневного остатка, хотя этот показатель определяются гораздо проще непосредственно через обороты как показано в статье [Расчет средних по периодам в запросе - это элементарно!]

***/ Тем, кому предложенный метод кажется слишком сложным, можно порекомендовать ознакомиться с методами построения, например, суффиксного массива, имеющих линейную трудоемкость О(N) [http://habrahabr.ru/post/115346/]. Тогда станет понятно, что такое по настоящему сложные методы достижения линейной трудоемкости.

Приложение

На тему нарастающего итога в запросах на языке платформы «1С:Предприятие» на Инфостарте сломано немало копий:

Отчет по просроченной задолженности/задолженность по интервалам (УПП УТ 8.1, СК

Нарастающие итоги в запросе и методы ускорения его выполнения

SubSys: Просроченная задолженность по срокам (режим - по договорам в целом ФИФО)

Подведем итоги. Нарастающие

Запрос. Нарастающий итог. Как «я» его понимаю.

Запрос. Нарастающий итог. Как «я» его НЕ понимаю (вторая часть).

БП1.6.Просроченная задолженность по 62 сч. Продолжение разго

ФИФО для любопытных

Запрос. Нарастающий итог. Как «я» его НЕ понимаю (третья часть).

Использование нарастающих итогов в партионном учете и не только

Нарастающие итоги. Объединение двух таблиц с нарастающими итогами

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

Наименование Файл Версия Размер
ОбработкаДляСравнительногоТестирования

.erf 9,87Kb
20.09.13
30
.erf 9,87Kb 30 Скачать
Отчет "Остатки на каждый интервал периода"

.erf 10,47Kb
21.09.13
63
.erf 10,47Kb 63 Скачать

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. kapustinag 20.09.13 20:19 Сейчас в теме
Да, это сильно. Снимаю шляпу.
При первом взгляде на текст запроса подумал, что выигрыш по времени начнет проявляться позже, так как стандартное решение содержит только операции сложения, а полученное Вами - много умножений, делений, вычитаний - то есть операций более медленных. Но с измерениями не поспоришь.
2. Yashazz 3318 21.09.13 22:20 Сейчас в теме
Ильдарович, а ты замерял в сравнении со штатными функциями СКД, которые теперь позволяют легко делать подобное? С "ВычислитьВыражение" и прочими? Что быстрее и оптимальнее по ресурсоёмкости?
4. ildarovich 7045 23.09.13 10:02 Сейчас в теме
(2) Нет, я этого не делал. "Нельзя объять необъятное" - пока сосредоточился на там, что можно сделать в самом запросе. С точки зрения быстроты, в коде, в отличии от запроса, нет проблемы обращения к предыдущим значениям ряда, поэтому там рассмотренная задача не представляет сложностей и решается быстро (метод "0" в обработке). Рассуждая логически, в СКД должно быть также, хотя все нужно проверять. С точки зрения оптимальности тут вообще нельзя ничего говорить, не определив всех условий конкретной практической задачи и не рассмотрев еще и разных последовательностей и комбинаций приемов, которые, возможно, нужно будет еще придумывать.
3. Поручик 4420 22.09.13 01:53 Сейчас в теме
Ужас. Статьи автора всегда читаю, как фантастику. Как в своё время читал описание Ады или Модулы-2. Кто в теме, тот в курсе.
spezc; корум; the1; +3 Ответить
47. spezc 661 06.04.17 04:53 Сейчас в теме
(3) Согласен, Сергей как из другой вселенной)))
5. foliage 23.09.13 10:27 Сейчас в теме
Прочтение статей автора не оставляет сомнений в его же "совсем общем" выводе.
6. Lemkus 23.09.13 12:02 Сейчас в теме
При нечетном количестве строк вроде не работает.
7. ildarovich 7045 23.09.13 12:59 Сейчас в теме
(6) Почему Вы так решили? - Скачайте и проверьте сами. - Метод работает на любом количестве строк(см. скриншот).
Прикрепленные файлы:
8. Lemkus 23.09.13 13:07 Сейчас в теме
(7) Пардон, невнимательно прошел по алгоритму
9. kuzev 40 23.09.13 17:02 Сейчас в теме
Занимался этой задачей год назад. Реализовал расчет простым запросом, как написано в начале статьи. Сравнивал только не номера строк, а даты. Данный прием потребовался для моделирования (расчета остатка на дату с учетом начального или конечного остатка, приходов и расходов).
ildarovich, запросы наше всё =)
12. ildarovich 7045 23.09.13 20:48 Сейчас в теме
(10) Ссылка относится к СКД. В статье речь идет о запросе. То есть результат получается не постобработкой результатов запроса в оперативной памяти в коде или СКД, а внутри запроса и с ним еще можно много чего после этого сделать. Интерес был в том, чтобы доказать, что ограничения реляционной модели манипулирования данными не такие уж и узкие, чтобы отказываться от нее при некоторых затруднениях.
14. kereo 56 23.09.13 21:09 Сейчас в теме
(12) это скорее заметка для себя =)
15. hogik 433 24.09.13 03:22 Сейчас в теме
(12)
"... ограничения реляционной модели манипулирования данными не такие уж и узкие, чтобы отказываться от нее при некоторых затруднениях."(с)
Сергей.
От неё (модели) не надо отказываться. Надо отказаться от языка "манипулирования данными"(с) в тех алгоритмах, где для его (языка) применения требуется голова Вашего уровня...
18. ildarovich 7045 25.09.13 01:39 Сейчас в теме
(15) Владимир! Я внимательно читаю Ваши комментарии. Но у меня есть своё, отличное от Вашего мнение на тему "реляционное vs навигационное" манипулирование данными. Мне представляется, что на данный момент правильность выбора концепции, заложенной в платформе, подтверждена практикой. Декларативный SQL-подобный язык запросов для извлечения данных, скриптовый процедурный язык для интерфейса и склейки различных механизмов, СКД - для представления (только ли?) данных пользователю. Брать за основу непроверенные временем технологии было бы и сейчас и тогда безответственно и недальновидно. А так, посмотрите: MSSQL, Postgre, DB2, Oracle. С чем другим мы бы сейчас работали, прими 1С в свое время другое решение? Взять проприетарную и очень проблемную Cashe и сложить все яйца в одну корзину? Придумать нечто совсем свое? Бежать впереди паровоза по непроторенному пути? Это непозволительная роскошь для фирмы, опирающейся на собственные силы. Возьмите ё-мобиль. Гораздо более хорошо исследованная и предсказуемая область, серьезные финансовые ресурсы. А результат тем не менее все еще не получен. Мы готовы ждать так долго в области информационных технологий?
Krasnyj; monkbest; hogik; +3 Ответить
11. Ёпрст 1040 23.09.13 17:55 Сейчас в теме
вот-вот, ключевое понятие - ид чего либо, например строки.
Не всегда это есть, к сожалению в обычных запросах. А спецом "нумеровать" результат - лишнее самосоединение.
Поентому, выигрыш решения..сомнительный.
13. ildarovich 7045 23.09.13 21:01 Сейчас в теме
(11) Да, нумерация нужна, но ее можно получить тем же приемом БЕЗ самосоединения.
Я не предлагаю этот прием как универсальный рецепт на все случаи жизни. В статье четко говорится, что при обработке в коде и в СКД затруднений с получением нарастающих итогов нет. Также говорится о том, что выигрыш начинается с больших значений числа строк - говорится каких. Кстати, есть более короткая версия того-же запроса, которая в файловом варианте работает на 30% быстрее (с использованием соединения, а не группировки в правом крыле). То есть выигрыш начинается еще с меньших цифр, чем сейчас указано.
16. ilov_boris 158 24.09.13 22:48 Сейчас в теме
"Где это можно использовать на практике?"
Нигде. Как умственное упражнение полезно. Но за использование подобного в продакшене нужно по рукам бить.
17. ildarovich 7045 25.09.13 00:57 Сейчас в теме
20. ilov_boris 158 25.09.13 09:51 Сейчас в теме
(17) это проще и нагляднее делать кодом. И кроме того есть регистры накопления для этих целей.
21. kereo 56 25.09.13 10:14 Сейчас в теме
(16) ilov_boris, задача из жизни сформировать отчет, где идет оценка склада по средней стоимости склада с нарастающим итогом с указаной даты и еще куча других цифр.
22. ildarovich 7045 25.09.13 10:16 Сейчас в теме
(16) Вот несколько практических задач:
1) Получить список менеджеров, установивших цены, которые в процентах максимально отличались от своих предыдущих значений;
2) Получить список номенклатурных позиций, отличающихся максимальной волатильностью цен, подсчитанной как частота изменений цен, больших чем среднее значение изменений;
3) Определить чек, в котором находится 1000-ая единица проданного товара (такие чеки будут участвовать в розыгрыше призов);
4) Пересчитать скидки по интервальной накопительной системе скидок при возврате товара;
5) Рассчитать выплаты по кредитной линии, если моменты выдачи и возврата денежных средств произвольны;
6) Рассчитать стоимость овердрафта по пластиковой карте в зависимости от его суммы и времени;
7) Рассчитать стоимость ответственного хранения (для сложных условий);
8) Провести пакетный расчет стоимости списания по скользящему среднему.
Все эти задачи имеют общее свойство - решаются с использованием тэта-соединений в запросах. То есть их трудоемкость определяется квадратичной зависимостью и может быть уменьшена до линейной применением предлагаемого приема.
Восьмой; корум; zaxarovsky; +3 Ответить
23. ilov_boris 158 25.09.13 10:27 Сейчас в теме
(22) "Все эти задачи имеют общее свойство -" решаются императивно.
SQL не для вычислений предназначен.
MrFlanker; hogik; +2 1 Ответить
24. kereo 56 25.09.13 14:04 Сейчас в теме
(23) ilov_boris, в налоговых инспекциях стоит система ЭОД(Электронная обработка данных), в которой очень много расчетов выполняет именно SQL, через запуск хранимых процедур, в т.ч. налогов.
25. hogik 433 25.09.13 18:33 Сейчас в теме
(24)
"много расчетов выполняет именно SQL, через запуск хранимых процедур"(с)

Сильный аргумент. :-) :-) :-)

Вот тут хорошо и кратко написано:

"Храни́мая процеду́ра — ... у них могут быть входные и выходные параметры и локальные переменные, в них могут производиться числовые вычисления и операции над символьными данными, результаты которых могут присваиваться переменным и параметрам. ... Кроме того, в хранимых процедурах возможны циклы и ветвления, то есть в них могут использоваться инструкции управления процессом исполнения."(с)
27. kereo 56 25.09.13 19:49 Сейчас в теме
(25), (26) hogik, Аргумент, может быть и не очень хороший.
Поясню, что я хотел этим сказать. Объем данных там очень большой, который используется для расчетов, в том числе и нарастающие итоги там тоже есть (к примеру регрессивная шкала начисления ЕСН или по новому страховых взносов). А пользуются этой системой по все России. Т. е. расчеты на SQL очень большого объема и применяемые не в одной и не 2-х организациях.

SQL это стандарт языка запросов. А хранимые процедуры написаны разве не на SQL?
Храни́мая процеду́ра — объект базы данных, представляющий собой набор SQL-инструкций

А вот, что написано в wikipedia на этот счет:
Со временем SQL усложнился — обогатился новыми конструкциями, обеспечил возможность описания и управления новыми хранимыми объектами (например, индексы, представления, триггеры и хранимые процедуры) — и стал приобретать черты, свойственные языкам программирования.
28. hogik 433 25.09.13 20:03 Сейчас в теме
(27)
"Аргумент, может быть и не очень хороший."(с)
Игорь (kereo).
Нет. Аргумент очень хороший. :-)
Т.к. подтверждает позицию/мнение оппонента.
26. hogik 433 25.09.13 19:12 Сейчас в теме
(24)
А чего Вы называете этими тремя буквами?
Многие называют SQL-ем всё, что называется СУБД. :-)
32. zaxarovsky 105 18.10.13 08:50 Сейчас в теме
19. hogik 433 25.09.13 02:01 Сейчас в теме
29. sapervodichka 25.09.13 22:10 Сейчас в теме
это просто Ужос!!! )))) (+1 поставил)
30. RailMen 30.09.13 01:40 Сейчас в теме
31. Silenser 525 30.09.13 14:14 Сейчас в теме
Статьи по запросам у автора очень интересны. Но я все же поддержу тех, кто считает, что подобные вычисления нужно разделять во времени, а не делать сиюминутно. Таблица итогов по периодам выглядит более прозрачно и понятнее, нежели динамически формируемый запрос. Возможно, это мои личные предпочтения, но динамически формируемые запросы я довольно сильно не люблю, т.к. крайне сложно читать логику и, зачастую, без отладчика разобрать мысль автора (не данного автора, а некого абстрактного программиста) крайне сложно.
Yakud3a; TeMochkiN; tormozit; корум; lunjio; It-developer; denis_aka_wolf; 3762515; MrFlanker; Valet; +10 Ответить
33. MrFlanker 175 18.01.14 18:22 Сейчас в теме
Публикация очень похожа на студенческую работу:... сделать понятные, простые вещи неудобным способом и назвать по своему.
34. Evil Beaver 6782 24.01.14 11:11 Сейчас в теме
35. ildarovich 7045 09.02.14 13:45 Сейчас в теме
В отчете "Возраст" остатков номенклатуры показан один из вариантов практического применения описанного метода.
36. speshuric 1171 19.02.14 13:21 Сейчас в теме
1. Не рассмотрен нарастающий итог с группировками. Сам по себе нарастающий итог - достаточно редкая задача, почти всегда интересует нарастающий итог в каком-то разрезе (например, контрагентов, товаров и т.п.). Как только появляются группировки, то возникает важная оговорка, что даже ресурсоёмкость начального "наивного" запроса растет лишь как квадрат самой толстой группы. А при грамотном разбиении на группы это уже не так страшно.
Тем более, если есть какие-то вспомогательные системы (например, хранимые остатки, как в РН), то размер максимальной группы не растёт так быстро.

2. Не совсем понял откуда оценка 4,5*N. Если из картинки, то там 4,5 для 8 записей и очевидно, что коэффициент 4,5 не сохранится для 16 записей. Там навскидку должно получаться что-то типа N*log(N). Но и эта оценка только количества операций суммирования: нет, например, оценки стоимости построения запроса, а в 1С в том виде, как вы написали, она не линейна от количества кусков.

3. В СУБД очень часто самым дефицитным ресурсом являются не процессоры, а количество дисковых операций и память. Да, для примитивной ситуации, когда есть только колонка сортировки и суммы, упереться в диски и память не получится. Но в реальной ситуации только кортеж группировки будет тянуть байт на 100-300. Тогда у вас tempdb захлебнётся (по памяти или дискам, они в данном случае взаимозаменяемы), ведь на суммирование нужно держать объём больше начального объёма таблицы (одно левое крыло уже больше). То есть на таблицах 10 и более ГБ батерфляй рискует грустно сдохнуть. "Наивный", правда, тоже сдохнет, но если не будет спасения в виде группировок.

4. Ну и если вы уж так упираетесь в нарастающий итог, то в SQL Server 2012 появились средства для их вычисления "одним запросом": MSDN: Пример В.Нахождение скользящей средней и кумулятивной суммы. Понятно, что это в 1С-ные запросы не попадает, но вариант точно быстрее и незатратный по памяти/дискам. Таким образом "непосредственно на языке T-SQL" ваше решение не следует использовать.

5. У вас колонка Ё не индексирована. Это влияет на план выполнения запроса. Не в десятки раз, конечно, но влияет.
37. ildarovich 7045 19.02.14 15:12 Сейчас в теме
(36) 1) Нарастающий итог с группировками не рассмотрен только для того, чтобы не усложнять изложение. Но это не является проблемой - в обработке, приложенной к статье и в отчете "Возраст" остатков номенклатуры, где также применяется данный метод, используются группировки - запрос становится лишь чуточку сложнее. Линейной зависимости величины затрат (времени, памяти) метода от числа строк группировки не нарушают.
2) У меня тоже сначала в голове крутилось N*log(N). Но на самом деле так было бы, если бы крылья бабочки имели равную ширину и не сужались бы быстро к центру (тогда бы это была и не бабочка). А поскольку крылья сужаются также как 1/log(N), то в итоге получаются ЛИНЕЙНАЯ ЗАВИСИМОСТЬ. Ведь сумма ряда 1 + 1/2 + 1/4 + 1/8 + 1/16 + ... = 2 (двум!). С левой стороны 2N, с правой стороны 2N, ну и еще на вычитание 0,5N. Так и получается 4,5N. Для 8-ми, 16-ти и сколько угодного исходного количества записей.
3) Квадратики на схеме обозначают не только операции процессора (суммирование), но и чтение, запись, хранение. Получается, что по сравнением с простой обработкой таблицы (например, добавлением единицы ко всем записям), потребуется в 4,5 раза больше ресурсов (процесссора, чтения, записи, места в tempdb). Это не в 20 и не в 100 раз больше! То есть для большой ширины кортежа потребуется еще 3,5 этой ширины на работу метода - не думаю, что это заставит сдохнуть сервер.
4) Про возможности SQL Server 2012 я знаю. В начале статьи есть ссылка на исследование именно этой новой возможности. Но, согласитесь, что алгоритмическая возможность фундаментальнее. Мы тут остаемся в рамках реляционного подхода, строго следуя заветам К. Дж. Дейта [SQL и реляционная теория. Как грамотно писать код на SQL].
-
Действительными ограничениями метода я считаю отсутствие во многих задачах исходной порядковой нумерации строк, нарастающий итог которых требуется получить. Кроме того, сейчас появилась возможность быстро рассчитывать нарастающий итог вне запроса (в СКД), что также сужает (хотя это вопрос все еще открытый - доказательств пока нет) область применения метода.
утюгчеловек; speshuric; +2 Ответить
38. speshuric 1171 19.02.14 17:57 Сейчас в теме
(37)
По оценке. Да, ок, я понял почему линейно зависит, хотя и не 4,5. Левое крыло 2N, действительно, а правое у меня получается заметно тяжелее. Вроде бы 4N (за счет схемы Р0*Л8+Л4 в П4, П4 в Л4), но нужно проверить расчеты. Но линейно.

По группировкам. Получается, что если в одной группе примерно до 100 элементов, то проще обойтись треугольным запросом. Если больше - до 1000, то надо проверять. Дальше - скорее всего бабочка обгонит.

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

По тому что "фундаментальнее" я не соглашусь. В реляционной теории на самом деле много еще неустоявшихся моментов, а уж того в чем "Р"СУБД вовсе даже и не "Р" - пруд пруди. Собственнно Дейт и Дарвен в третьем манифесте (относительно связки с ОО) и других трудах еще 15 лет назад это описывали.
39. ildarovich 7045 21.02.14 09:25 Сейчас в теме
(38) В целом согласен с Вашими оценками - Вы уловили самую суть.
Хотел было поспорить по-поводу "фундаментальнее", но теперь передумал. Будет напоминать спор Шелдона и Леонарда (из известногоо сериала) по-поводу того, какая физика круче: теоретическая или экспериментальная. Результат предсказуем - каждый останется при своем мнении.
40. ildarovich 7045 21.02.14 13:02 Сейчас в теме
(38)(39) Все же не удержусь, чтобы привести аргументы в поддержку «фундаментальности» решения.
По сравнению с новыми оконными функциями сервера MS SQL 2012 метод оперирует более высокими уровнями абстракции, то есть слабо зависит от программной и аппаратной платформы, а может работать и без компьютера вообще!
Представьте себе, что вы стоите в многотысячной очереди в Храм, например. Вас, как и всех в очереди, конечно, интересует, когда Вы туда попадете. Попросите людей в очереди оценить время своей молитвы (или, как сейчас говорят, «попытки связаться с разработчиком») , прибавить его ко времени, записанного на листочке впереди стоящим человеком и передать этот листок по очереди дальше. Если оценить, что одному человеку на это потребуется примерно 20 секунд, то для 10 тысяч человек в очереди потребуется примерно 55 минут. Если же применить «бабочку» - расположить рядом еще 10 тысяч «счетчиков» в виде бинарного дерева (крыла бабочки), то результат будет получен уже примерно через 10 минут – в 5,5 раз быстрее. Для 100 тысяч человек получится уже 555 / 12 минут – в 50 раз быстрее (приблизительно). То есть ускоряется даже не «треугольник», а простой линейный подсчет. «Бабочка» дает возможность распараллеливания расчета нарастающего итога!
Так что стоит задуматься (не нам) над тем: - Не применить ли «бабочку» при реализации самих оконных функций в MS SQL для распараллеливания этих операций? А всякие модные сейчас распределенные вычисления и СУБД, Биг-Даты и тому подобное?
Вот, что я имел в виду, говоря, что данное решение более общее (фундаментальное).
41. speshuric 1171 21.02.14 17:15 Сейчас в теме
(40) Стоп-стоп.
1. Я не буду стоять в Храм. Давайте это лучше будет очередь улететь на Марс :)
2. 20 секунд и 10000 человек последовательно передают данные - это 200000 секунд. Это 55 часов. Не минут.
3. Левое крыло, если все будут действовать параллельно, просчитается за 16 итераций. Правое - тоже логарифм, но в уме что-то не прикину будет оверхэд или не будет. Пусть даже и не будет - всё равно 32 итерации 32*20 - 640 секунд. Отличный, кстати, результат.
4. Но если представить себе всю эту тусовку, то станет понятно, что управлять такой распараллеленной операцией будет ОЧЕНЬ тяжело. И возникнут оверхэды на синхронизацию, хождение и управление. Но, кстати, в час-полтора будет уложиться всё равно реально.

Это хорошая демонстрация бесконечного распараллеливания в "последовательной" задаче. И, да, он во всяких хадупах и т.п. проканает, наверное (хотя сходу у меня в голове этот алгоритм в мэп-редьюс не укладывается).
И я не спорю, что это эффективно и круто.
Я же функцию SUM-ORDER BY считаю потому более фундаментальной, что она не декларирует как считать. А считать она может как угодно (той же бабочкой). Собственно, мне кажется, это и была одна из главных идей РСУБД - отделить задачу от реализации.
HystriX; ildarovich; +2 Ответить
42. Sergey.Noskov 16.07.14 13:50 Сейчас в теме
В давние времена, когда брался за решение сложной задачи именно с мыслями "Какая интересная задачка, но мне любой запрос по плечу!" то приходилось ваять мегабайты строк запросов.
Потом, когда заинтересовался спецификой крупных внедрений и областью задач уровня 1С:Эксперт, прочитал просто гениальную фразу на диске ИТС: "Регистр должен быть самодостаточным" и образ мышления развернулся в сторону "Какая интересная задачка, надо хорошенько продумать архитектуру".
Понимаю, что нарастающий итог - задача не тривиальная, но и тут можно разработать архитектурное решение, которое покроет 90% сценариев формирования отчета при котором запрос будет до безобразия примитивным.
43. ildarovich 7045 17.07.14 12:14 Сейчас в теме
(42) serno, все это абстрактная философия.В конкретных случаях она может не помочь.
нарастающий итог - задача не тривиальная, но и тут можно разработать архитектурное решение, которое покроет 90% сценариев формирования отчета при котором запрос будет до безобразия примитивным
Конечно, нужно разрабатывать эти архитектурные решения и сравнивать затраты на поддержание в актуальном состоянии вспомогательных структур данных и выгоды в виде сокращения времени выполнения запроса. Однако, во-первых, здесь нет уверенности, что "кубиков", которые есть в 1С всегда будет достаточно для построения любых необходимых структур данных. Во-вторых, иногда находятся алгоритмические решения, которые дают очень большие выигрыши во времени без всяких вспомогательных структур данных. Один из примеров приведен в статье "Неоплаченные долги при распределении оплаты по правилу ФИФО одним запросом и намного быстрее, чем Вы думали". Вот такие решения я и ищу.
44. danila_inf 22.08.14 17:50 Сейчас в теме
Как решение достаточно оригинально.
Оценить можно с разных сторон.
И с точки зрения сборки запроса(- неудобно)
и по времени выполнения (+ быстрее)
Для меня лично ограничений больше чем возможностей.
В моей практике не было запросов(работающих на реальном предприятии), с нарастающим итогом выполняющихся очень долго. Так что следующий запрос с нарастающим итогом напишу по старинке))
45. ildarovich 7045 14.05.15 13:31 Сейчас в теме
Вот в этой статье http://habrahabr.ru/company/epam_systems/blog/247805/ говорится о том, что очень похожий метод применяется в параллельных алгоритмах "свертки", выполняемых графической подсистемой CUDA. Приведена очень похожая картинка. Метод назван Blelloch scan. Говорится о его высокой эффективности.
Похоже, что нарастающий итог - это задача prefix sum.
46. ildarovich 7045 13.07.16 13:45 Сейчас в теме
По тому же принципу можно считать нарастающий итог не сумм, а произведений. Тоже будет быстро.
Оставьте свое сообщение

См. также

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

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

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

1 стартмани

25.03.2019    32976    tormozit    44    

Запуск фонового задания во внешней обработке без регистрации в справочнике "Дополнительные отчеты и обработки"

Практика программирования v8::УФ ЗУП3.x Россия Абонемент ($m)

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

1 стартмани

09.03.2020    3595    VinnieThePOOH    5    

Методика обновления формы объекта данных при изменении объекта

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

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

1 стартмани

09.03.2020    6813    tormozit    13    

Отправка уведомлений с помощью командной строки, Оповещения с сервера на клиент с помощью командной строки

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

Отправка уведомлений с помощью команды командной строки msg. Оповестить пользователей из серверного модуля или регламентного задания, с помощью командной строки msg.

1 стартмани

05.03.2020    5024    user5300    3    

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

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

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

2 стартмани

08.05.2018    26560    wowik    3    

Вывод сообщений в HTML поле средствами 1С

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

Пример использования вывода большого количества сообщений в поле HTML. С возможностью открывать ссылочные объекты и создавать новые объекты передавая параметры прямо из HTML поля. Протестировано на релизах 8.3.12 и 8.3.15+

2 стартмани

31.01.2020    5173    burni4    16    

Как в 1С создать паутинку "как на Инфостарте"

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

Добрый день, уважаемы коллеги! В этой статье я расскажу, как в 1С создать отчет - "паутинку" на примере отчета по компетенциям сотрудника (разрабатывала на платформе 1С:Предприятие 8.3 (8.3.13.1865).

1 стартмани

15.01.2020    8887    user660153_aleks.pisanets    17    

Краткое руководство по внесению изменений в конфигурацию

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

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

1 стартмани

13.01.2020    15875    sapervodichka    41    

Программное создание динамического списка на управляемой форме. (Динамическое создание динамического списка). Готовая процедура + обработка - демонстрационный пример Промо

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

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

1 стартмани

19.01.2018    55226    rpgshnik    27    

"Живые" картинки со Snap.SVG

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

В статье рассмотрен пример использования http-сервисов для визуализации данных

1 стартмани

24.10.2019    12865    blackhole321    7    

RLS - дубли условий в запросах к СУБД

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

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

1 стартмани

07.10.2019    8122    geron4    4    

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

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

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

1 стартмани

07.10.2019    28046    HostHost    40    

Как нарисовать граф на 1С Промо

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

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

1 стартмани

09.08.2013    69816    ildarovich    117    

Полное копирование одной формы в другую

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

Однажды я столкнулся с необходимостью открыть форму ЛЮБОГО документа с определенными изменениями, не зависящими от структуры объекта (например, заблокировать все кнопки). В интернете решения я не нашел. Обычно на форумах на запросы подобного рода отвечают чем-то вроде "покажи первоначальную задачу, а не спрашивай как реализовать то, что ты придумал". Тем не менее, мне стало интересно, как это можно сделать.

1 стартмани

03.10.2019    4516    nekit_rdx    23    

Многопоточная обработка данных на примере перепроведения документов

Обработка документов Практика программирования v8 ERP2 УТ11 КА2 Абонемент ($m)

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

1 стартмани

17.09.2019    8639    ids79    46    

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

Документооборот и делопроизводство Практика программирования v8 ДО Абонемент ($m)

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

1 стартмани

15.09.2019    6416    pavelpribytkin96    8    

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

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

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

1 стартмани

28.09.2016    39038    ildarovich    22    

Описание формата внутреннего представления данных 1С в контексте обмена данными

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

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

1 стартмани

06.09.2019    18670    Dementor    30    

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

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

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

1 стартмани

27.08.2019    10540    ids79    21    

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

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

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

2 стартмани

24.08.2019    9730    BenGunn    22    

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

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

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

1 стартмани

01.02.2018    34573    rpgshnik    49    

Изменяющееся контекстное меню в 1С 8.3

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

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

1 стартмани

06.08.2019    14677    signum2009    16    

Упражнения на Перфоленте. Парсим технологический журнал 1С

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

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

1 стартмани

31.07.2019    7274    Perfolenta    62    

Процедура ПриКомпоновкеРезультата

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

Коллекция кода

1 стартмани

26.07.2019    34442    vasilev2015    63    

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

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

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

1 стартмани

10.05.2018    43188    dsdred    36    

В 1000 раз быстрее

Практика программирования Разработка ИТ-компания Абонемент ($m)

Реализация алгоритма трассировки лучей на новом языке программирования "Перфолента"

1 стартмани

24.07.2019    5570    vasvl123    6    

10 способов получить модуль числа (а может, и больше)

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

Пишем функцию вычисления модуля числа. Сколько способов существует? Давайте посчитаем!

1 стартмани

11.07.2019    7201    sam441    29    

Ловец дедлоков СУБД

Производительность и оптимизация (HighLoad) Практика программирования Разработка v8 Россия Абонемент ($m)

Анализ простейшего дедлока СУБД в рабочей базе с использованием ЦУП (центра управления производительностью) и profiler MS SQL (Microsoft SQL Server). Эта статья будет полезна людям, изучающим вопросы оптимизации работы 1С, или тем, у кого возникают дедлоки в рабочей базе. UPD 09.07.2019 добавлено воспроизведение блокировки в случае установки управляемой блокировки перед чтением набора записей регистра сведений. UPD 10.07.2019 добавлена тестовая база с примером.

1 стартмани

08.07.2019    10695    azazana    79    

Некоторая работа с данными через COM Промо

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

В статье приведены примеры работы с Платформой 8.X через COM (точнее, через объект COMConnector). Примеры кода были использованы при реализации прикладных задач в процессе трудовой деятельности.

2 стартмани

05.12.2012    56873    wowik    32    

Многоуровневая нумерация в отчете СКД (программный вывод)

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

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

1 стартмани

01.07.2019    6844    lmnlmn    7    

Мониторинг производительности и искусственный интеллект

Производительность и оптимизация (HighLoad) Практика программирования Разработка v8 Абонемент ($m)

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

1 стартмани

01.07.2019    8953    ivanov660    28    

"Убер на складе": динамический расчет маршрутов с учетом реальных расстояний

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

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

3 стартмани

24.06.2019    14164    informa1555    17    

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

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

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

1 стартмани

24.04.2018    42465    kalyaka    34    

1С:Ассемблер. Немного летнего веселья!

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

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

1 стартмани

21.06.2019    27559    Evil Beaver    119    

Простые примеры сложных отчетов на СКД

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

Подписи в отчете. Особенности соединения наборов: как соединить несоединяемое. Остатки на дату и обороты по месяцам в одном отчете. Курс валюты на каждую дату без группировок и соединений в запросе. Отчет с произвольными колонками и с произвольной последовательностью. "Неадекватный отчет".

1 стартмани

12.06.2019    28295    Hatson    22    

Создание внешней печатной формы в формате документа Word

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

В статье написано, как создать внешнюю печатную форму (для конфигураций с БСП) в формате Word.

1 стартмани

17.05.2019    11756    ВикторП    20    

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

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

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

26.05.2017    48486    DarkAn    86    

Пример настройки шаблонов и реализации печати отчетов в документ MS Word используя функциональную часть "Библиотеки Стандартных Подсистем 1С" (БСП)

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

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

1 стартмани

23.04.2019    5703    olegpkc    11    

Ops средствами 1С:Предприятие

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

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

1 стартмани

23.04.2019    17039    blackhole321    28    

1C + Python + Django Rest Framework + Vue.js. Опыт несложной full-stack разработки

Практика программирования Внешние источники данных Обмен через XML WEB Разработка v8 1cv8.cf Абонемент ($m)

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

1 стартмани

22.04.2019    31325    riposte    63    

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

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

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

1 стартмани

27.11.2012    44894    ildarovich    46    

Вывод вариантов СКД в таблицы на управляемой форме

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

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

05.04.2019    10490    artkor    1    

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

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

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

1 стартмани

12.03.2019    32092    ni_cola    29    

Баг или фича? Неожиданное поведение платформы

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

Рассмотрим несколько случаев неожиданного поведения платформы 1С, а также что с этим можно cделать.

18.02.2019    22567    YPermitin    89    

Уровни, глубина, прародители, циклы и аналоги запросом Промо

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

В продолжение публикации «Транзитивное замыкание запросом» [http://infostart.ru/public/158512/] добавлены другие варианты использования того же приема. Приведены запросы для быстрого определения уровней всех элементов справочника, максимальной глубины справочника, прародителей произвольных элементов справочника, запрос для быстрого определения циклов (на примере справочника спецификаций «1С:Управление производственным предприятием») и определения множеств аналогов номенклатуры (также на примере конфигурации «1С:Управление производственным предприятием»).

1 стартмани

13.11.2012    110471    ildarovich    98    

Альтернатива внешним печатным формам. ЗУП 3.1

Печатные формы документов Универсальные функции Зарплата Практика программирования Зарплата Разработка v8 v8::СПР ЗУП3.x Абонемент ($m)

Как в ЗУП 3.1.8 отказаться от внешних печатных форм и расширением увеличить количество полей, доступных при редактировании макетов, для изменения печатных форм Т1, Т5, Т8 и аналогичные пользователями.

1 стартмани

30.01.2019    13940    Mogilnikova    3    

HTML в новой версии 8.3.14 на примере 3-х JavaScript библиотек: AmCharts, HighCharts, DHTMLX

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

Тестируем возможности HTML в новой версии 8.3.14 платформы на примере 3-х JavaScript библиотек: AmCharts, HighCharts, DHTMLX.

1 стартмани

29.01.2019    27720    Synoecium    46    

Разработка и сценарное тестирование с Vanessa-ADD. Практические примеры сценариев. Шаги встроенной библиотеки

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

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

1 стартмани

28.01.2019    18695    Vladimir Litvinenko    43    

Неоплаченные долги при распределении оплаты по правилу ФИФО одним запросом и намного быстрее, чем Вы думали Промо

Практика программирования Дебиторская и кредиторская задолженность Дебиторская и кредиторская задолженность v8 v8::СКД КА1 УТ10 УПП1 УУ Абонемент ($m)

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

1 стартмани

28.02.2014    67618    ildarovich    123    

1c + kafka.apache

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

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

1 стартмани

27.01.2019    13521    dmarenin    69    

Реализация простого http-сервиса "Просмотр карточки номенклатуры(товара) в браузере"

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

Практический пример реализации простого http-сервиса средствами 1С Предприятие 8.3. Обеспечивает просмотр списка товаров и просмотр данных товара в браузере.

1 стартмани

07.12.2018    21690    dmitry1975    32    

СКД. Сортировка

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

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

1 стартмани

03.12.2018    8934    slimper    21