Теорема номер тринадцать

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

Разработка - Математика и алгоритмы

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

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

Предисловие

Один из приемов оптимизации запросов - замена соединения на объединение. Например, в СУБД Postgres полное соединение может вызвать тормоза. Тем не менее, не будем обсуждать преимущества и недостатки такого приема - применение зависит от конкретной ситуации. Проблема в том, что не всегда очевидно, когда можно выполнить такое преобразование без изменения результата запроса. Работать на авось, заметать грязь под ковер - не наши методы )). Укажем условия, когда два запроса будут эквивалентны, то есть результаты запросов будут совпадать для всех наборов данных - замена будет возможна. Доказательство теоремы будет проведено методом математической индукции для множеств конечной меры. Алгоритмы полного соединения, объединения, группировки хотя и имеют машинную реализацию, но прозрачны для пользователя. Поэтому метод математической индукции вполне уместен. Думаю, аналогичный результат известен в курсе реляционной алгебры, но ссылку найти не могу. Буду благодарен, если кто покажет. Если найдете ошибку в доказательстве — буду благодарен вдвойне.

Определим переменные

ТаблицаА — источник данных (таблица), содержит колонки КлючА, ПолеА.

ТаблицаБ — источник данных (таблица), содержит колонки КлючБ, ПолеБ.

Запрос1 = Новый Запрос;
Запрос1.Текст =
"ВЫБРАТЬ
ЕСТЬNULL(ТаблицаА.КлючА, ТаблицаБ.КлючБ) КАК Ключ,
ТаблицаА.КлючА,
ТаблицаА.ПолеА,
ТаблицаБ.КлючБ,
ТаблицаБ.ПолеБ
ИЗ
ТаблицаА КАК ТаблицаА
ПОЛНОЕ СОЕДИНЕНИЕ ТаблицаБ КАК ТаблицаБ
ПО ТаблицаА.КлючА = ТаблицаБ.КлючБ";

////////////////////////////////////////////////////////////////////////

Запрос2 = Новый Запрос;
Запрос2.Текст =
"ВЫБРАТЬ
ВложеннаяТаблица2.Ключ,
МАКСИМУМ(ВложеннаяТаблица2.КлючА) КАК КлючА,
МАКСИМУМ(ВложеннаяТаблица2.ПолеА) КАК ПолеА,
МАКСИМУМ(ВложеннаяТаблица2.КлючБ) КАК КлючБ,
МАКСИМУМ(ВложеннаяТаблица2.ПолеБ) КАК ПолеБ
ИЗ
(ВЫБРАТЬ
ТаблицаА.КлючА КАК Ключ,
ТаблицаА.КлючА КАК КлючА,
NULL КАК КлючБ,
ТаблицаА.ПолеА КАК ПолеА,
NULL КАК ПолеБ
ИЗ
ТаблицаА КАК ТаблицаА

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

ВЫБРАТЬ
ТаблицаБ.КлючБ,
NULL,
ТаблицаБ.КлючБ,
NULL,
ТаблицаБ.ПолеБ
ИЗ
ТаблицаБ КАК ТаблицаБ) КАК ВложеннаяТаблица2

СГРУППИРОВАТЬ ПО
ВложеннаяТаблица2.Ключ";

Теорема

Пусть выполняются условия:

  • ТаблицаА не содержит повторений по полю КлючА
  • ТаблицаА не содержит в поле КлючА значений NULL
  • ТаблицаБ не содержит повторений по полю КлючБ
  • ТаблицаБ не содержит в поле КлючБ значений NULL

Тогда Запрос1 эквивалентен Запрос2. Результаты запросов совпадают для всех наборов данных.

Примечание 1

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

Примечание 2

Если поля — числовые, то можно использовать агрегатную функцию суммы, вместо Null для пустых полей таких столбцов устанавливать 0. При этом надо помнить, что агрегатные функции Сумма, Максимум «игнорируют» поля типа Null, возвращая результат так, как будто полей Null нет, хотя (Число+Null ) IS Null.

Примечание 3

Колонки могут сами состоять из нескольких колонок, то есть теорема распространяется на источники данных с многими колонками: Ключ1А, Ключ2А, … КлючXА, Поле1А, Поле2А, … ПолеYА.

Примечание 4

Выражение ЕСТЬNULL(ТаблицаА.КлючА, ТаблицаБ.КлючБ) будет равно либо ТаблицаА.КлючА, при ТаблицаБ.КлючБ IS NULL, либо ТаблицаБ.КлючБ, при ТаблицаА.КлючА IS NULL, либо ТаблицаА.КлючА = ТаблицаБ.КлючБ - поскольку полное соединение происходит по условию равенства. То есть выражение ЕСТЬNULL(ТаблицаА.КлючА, ТаблицаБ.КлючБ) симметрично и совпадает с результатом группировки.

Следствие 1

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

Запрос3 = Новый Запрос;
Запрос3.Текст =
"ВЫБРАТЬ
ЕСТЬNULL(ТаблицаА.КлючА, ТаблицаБ.КлючБ) КАК Ключ,
ТаблицаА.КлючА,
ТаблицаА.ПолеА,
ТаблицаБ.КлючБ,
ТаблицаБ.ПолеБ
ИЗ
ТаблицаА КАК ТаблицаА
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаБ КАК ТаблицаБ
ПО ТаблицаА.КлючА = ТаблицаБ.КлючБ";

////////////////////////////////////////////////////////////////////////

Запрос4 = Новый Запрос;
Запрос4.Текст =
"ВЫБРАТЬ
ВложеннаяТаблица2.Ключ,
МАКСИМУМ(ВложеннаяТаблица2.КлючА) КАК КлючА,
МАКСИМУМ(ВложеннаяТаблица2.ПолеА) КАК ПолеА,
МАКСИМУМ(ВложеннаяТаблица2.КлючБ) КАК КлючБ,
МАКСИМУМ(ВложеннаяТаблица2.ПолеБ) КАК ПолеБ
ИЗ
(ВЫБРАТЬ
ТаблицаА.КлючА КАК Ключ,
ТаблицаА.КлючА КАК КлючА,
NULL КАК КлючБ,
ТаблицаА.ПолеА КАК ПолеА,
NULL КАК ПолеБ,
1 КАК ОграничительА,
0 КАК ОграничительБ
ИЗ
ТаблицаА КАК ТаблицаА

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

ВЫБРАТЬ
ТаблицаБ.КлючБ,
NULL,
ТаблицаБ.КлючБ,
NULL,
ТаблицаБ.ПолеБ,
0,
1
ИЗ
ТаблицаБ КАК ТаблицаБ) КАК ВложеннаяТаблица2

СГРУППИРОВАТЬ ПО
ВложеннаяТаблица2.Ключ

ИМЕЮЩИЕ
СУММА(ВложеннаяТаблица2.ОграничительА) > 0
И СУММА(ВложеннаяТаблица2.ОграничительБ) > 0";

КОНТРПример 1.

Воспроизведем ситуацию, когда условия теоремы НЕ выполняются — результаты запросов не совпадают.

ТаблицаА содержит две строки (Ключ1А, Поле1А), (Ключ1А, Поле2А)

ТаблицаБ содержит две строки (Ключ1Б, Поле1Б), (Ключ2Б, Поле2Б)

ВЫБРАТЬ
"Ключ1А" КАК КлючА,
"Поле1А" КАК ПолеА
ПОМЕСТИТЬ ТаблицаА

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

ВЫБРАТЬ
"Ключ1А",
"Поле2А"
;
///////////////////////////////////////////////////////////

ВЫБРАТЬ
"Ключ1Б" КАК КлючБ,
"Поле1Б" КАК ПолеБ
ПОМЕСТИТЬ ТаблицаБ

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

ВЫБРАТЬ
"Ключ2Б",
"Поле2Б"

 

Результат Запрос1

Ключ

КлючА

ПолеА

КлючБ

ПолеБ

Ключ1А

Ключ1А

Поле1А

NULL

NULL

Ключ1А

Ключ1А

Поле2А

NULL

NULL

Ключ1Б

NULL

NULL

Ключ1Б

Поле1Б

Ключ2Б

NULL

NULL

Ключ2Б

Поле2Б

 

Результат Запрос2

Ключ

КлючА

ПолеА

КлючБ

ПолеБ

Ключ1А

Ключ1А

Поле2А

NULL

NULL

Ключ1Б

NULL

NULL

Ключ1Б

Поле1Б

Ключ2Б

NULL

NULL

Ключ2Б

Поле2Б

 

КОНТРПример 2

Воспроизведем ситуацию, когда условия теоремы НЕ выполняются — результаты запросов не совпадают.

ТаблицаА содержит одну строку (NULL, Поле1А)

ТаблицаБ содержит одну строку (NULL, Поле1Б)

ВЫБРАТЬ
NULL КАК КлючА,
"Поле1А" КАК ПолеА
ПОМЕСТИТЬ ТаблицаА
;
///////////////////////////////////////////////////////

ВЫБРАТЬ
NULL КАК КлючБ,
"Поле1Б" КАК ПолеБ
ПОМЕСТИТЬ ТаблицаБ

 

Результат Запрос1

Ключ

КлючА

ПолеА

КлючБ

ПолеБ

NULL

NULL

Поле1А

NULL

NULL

NULL

NULL

NULL

NULL

Поле1Б

 

Результат Запрос2

Ключ

КлючА

ПолеА

КлючБ

ПолеБ

NULL

NULL

Поле1А

NULL

Поле1Б

 

Доказательство будем проводить методом математической индукции. На первом шаге проверим утверждение на минимальном числе строк таблиц ТаблицаА, ТаблицаБ. Второй шаг — предположим, что утверждение выполняется для таблиц ТаблицаА, ТаблицаБ в которых содержится X и Y строк соответственно. Третий шаг — используя предположение шага 2 докажем, что утверждение выполняется для таблиц ТаблицаА, ТаблицаБ в которых содержится (X+1) и Y строк соответственно. В случае, если условия симметричны относительно ТаблицаА, ТаблицаБ, на этом доказательство заканчивается. Это хорошо изученный, классический, но трудный для понимания метод.

Шаг первый.

Следует учитывать, что рассматриваемые операции симметричны относительно выборок, поэтому количество вариантов можно сократить.

Вариант 1.

Ключ1А <> Ключ1Б, Ключ2А <> Ключ2Б, Ключ1А <> Ключ2А, Ключ1Б <> Ключ2Б

ТаблицаА, содержит две строки (Ключ1А, Поле1А), (Ключ2А, Поле2А),

ТаблицаБ, содержит две строки (Ключ1Б, Поле1Б), (Ключ2Б, Поле2Б).

 

Результаты Запрос1, Запрос2 совпадают

Ключ

КлючА

ПолеА

КлючБ

ПолеБ

Ключ1А

Ключ1А

Поле1А

NULL

NULL

Ключ1Б

NULL

NULL

Ключ1Б

Поле1Б

Ключ2А

Ключ2А

Поле2А

NULL

NULL

Ключ2Б

NULL

NULL

Ключ2Б

Поле2Б

Вариант 2.

Ключ1А = Ключ1Б, Ключ2А <> Ключ2Б, Ключ1А <> Ключ2А, Ключ1Б <> Ключ2Б

ТаблицаА, содержит две строки (Ключ1А, Поле1А), (Ключ2А, Поле2А),

ТаблицаБ, содержит две строки (Ключ1А, Поле1Б), (Ключ2Б, Поле2Б).

Результаты Запрос1, Запрос2 совпадают

Ключ

КлючА

ПолеА

КлючБ

ПолеБ

Ключ1А

Ключ1А

Поле1А

Ключ1А

Поле1Б

Ключ2А

Ключ2А

Поле2А

NULL

NULL

Ключ2Б

NULL

NULL

Ключ2Б

Поле2Б

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

Шаг второй.

Пусть теорема выполняется для таблиц ТаблицаА(X записей), ТаблицаБ (Y записей). ТаблицаА не содержит повторений по полю КлючА и ТаблицаБ не содержит повторений по полю КлючБ. Запрос1 и Запрос2 эквивалентны, то есть дают одинаковый результат на всех наборах данных.

 

ТаблицаА

КлючА

ПолеА

Ключ1А

Поле1А

...

КлючXА

ПолеXА

 

ТаблицаБ

КлючБ

ПолеБ

Ключ1Б

Поле1Б

...

КлючYБ

ПолеYБ

 

Поскольку для выборки порядок строк не важен, мысленно переместим строки внутри выборки так, чтобы образовалось три группы. При этом первые W значений ключевого поля совпадают: Ключ1А = Ключ1Б, … , КлючWА = КлючWБ. Для остальных значений ключевые поля — отличаются.

 

Результаты Запрос1, Запрос2 совпадают:

 

Ключ

КлючА

ПолеА

КлючБ

ПолеБ

Ключ1А

Ключ1А

Поле1А

Ключ1Б

Поле1Б

КлючWА

КлючWА

ПолеWА

КлючWБ

ПолеWБ

Ключ(W+1)А

Ключ(W+1)А

Поле(W+1)А

NULL

NULL

КлючXА

КлючXА

ПолеXА

NULL

NULL

Ключ(W+1)Б

NULL

NULL

Ключ(W+1)Б

Поле(W+1)Б

КлючYБ

NULL

NULL

КлючYБ

ПолеYБ

Шаг третий.

Добавим в ТаблицаА еще одну строку Ключ(X+1)А, Значение(X+1)А. По условиям теоремы, ТаблицаА не содержит повторений по полю КлючА, то есть все значения поля различные.

Вариант 1.

Среди значений поля КлючБ нет ни одного, равного Ключ(X+1)А.

При расчете результата Запрос1 (Полное соединение) добавится еще одна строка.

 

Ключ

КлючА

ПолеА

КлючБ

ПолеБ

Ключ1А

Ключ1А

Поле1А

Ключ1Б

Поле1Б

КлючWА

КлючWА

ПолеWА

КлючWБ

ПолеWБ

Ключ(W+1)А

Ключ(W+1)А

Поле(W+1)А

NULL

NULL

КлючXА

КлючXА

ПолеXА

NULL

NULL

Ключ(X+1)А

Ключ(X+1)А

Поле(X+1)А

NULL

NULL

Ключ(W+1)Б

NULL

NULL

Ключ(W+1)Б

Поле(W+1)Б

КлючYБ

NULL

NULL

КлючYБ

ПолеYБ

При расчете результата Запрос2 — строка добавится в ВложеннаяТаблица2 как Объединение, при группировке эта строка не сгруппируется ни с одной строкой по условиям выше — тоже будет дополнительная строка. Результаты Запрос1, Запрос2 совпадают.

Вариант 2.

В силу требований теоремы значения поля КлючБ различны между собою. Поэтому не может быть случая, когда несколько полей равно Ключ(X+1)А. Однако, одно из значений поля КлючБ может быть равно Ключ(X+1)А. Совпадают (W+1) значений ключевого поля. Запишем результат в таблицу, проверим Запрос1, Запрос2 опираясь на результаты второго шага.

Ключ

КлючА

ПолеА

КлючБ

ПолеБ

Ключ1А

Ключ1А

Поле1А

Ключ1Б

Поле1Б

КлючWА

КлючWА

ПолеWА

КлючWБ

ПолеWБ

Ключ(W+1)А

Ключ(W+1)А

Поле(W+1)А

Ключ(W+1)Б

Поле(W+1)Б

Ключ(W+2)А

Ключ(W+2)А

Поле(W+2)А

NULL

NULL

Ключ(X+1)А

Ключ(X+1)А

Поле(X+1)А

NULL

NULL

Ключ(W+2)Б

NULL

NULL

Ключ(W+2)Б

Поле(W+2)Б

КлючYБ

NULL

NULL

КлючYБ

ПолеYБ

Результаты Запрос1, Запрос2 совпадают. Что и требовалось доказать.

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

15

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

Вознаграждение за ответ
Показать полностью
Комментарии
Избранное Подписка Сортировка: Древо
1. bulpi 157 15.03.18 12:26 Сейчас в теме
Уважаемый, я ничего не понял. А я ведь мехмат заканчивал, хоть и давно. Зачем пытаться доказать теорему, которая явно не верна ? Результаты запросов 1 и 2 совпадают не всегда, даже при выполнении указанных условий. И Вы сами это показали в примерах. Чувствую, что я где-то туплю, но где ?
ipoloskov; starik-2005; +2 Ответить
2. vasilev2015 1418 15.03.18 12:50 Сейчас в теме
Здравствуйте ! Примеры приведены корректно: в них условия теоремы НЕ выполняются - поэтому запросы не эквивалентны. Почему считаете, что теорема не верна ? Добавил символичное вознаграждение, чтобы Вам было интереснее.
alexei366; +1 Ответить
3. vasilev2015 1418 15.03.18 14:30 Сейчас в теме
Коллеги, я вижу что не все понимают.

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

Вместо слов "пример" поставил слова "КонтрПример" чтобы было понятнее.

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

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

Добавил еще немного вознаграждения ))
4. TODD22 18 15.03.18 14:37 Сейчас в теме
Один из приемов оптимизации запросов - замена соединения на объединение.

А что оптимизируют таким способом? Скорость выполнения?
itriot11; +1 Ответить
5. vasilev2015 1418 15.03.18 14:44 Сейчас в теме
(4) таким образом программисты 1С помогают СУБД выбрать оптимальный план запроса, а от этого выбора фундаментально зависит скорость работы запроса и блокировки, которые могут появляться вследствие работы запроса.
6. TODD22 18 15.03.18 15:07 Сейчас в теме
(5) А сравнительные тесты методов будут? Какой вариант быстрее работает в повседневных задачах на файловой, на SQL сервере.
7. vasilev2015 1418 15.03.18 15:15 Сейчас в теме
(6)
Не будем обсуждать преимущества и недостатки такого приема - применение зависит от конкретной ситуации.

Для MS SQL сравнивать нужно в MS Profiler. Это отдельная тема.
8. TODD22 18 15.03.18 15:33 Сейчас в теме
(7) Да хотя бы простое сравнение. Без профайлера. Интересует какая реально будет разница, на одном и том же объёме данных. А так без цифр говорить об оптимизации. Чем то же её надо измерить, оптимизацию.
Не будем обсуждать преимущества и недостатки такого приема - применение зависит от конкретной ситуации.

А где можно почитать про преимущества и недостатки и для какой конкретной ситуации можно применять, а для какой не имеет смысла? Что бы для себя понять, есть ли практический смысл или нет.
9. vasilev2015 1418 15.03.18 15:37 Сейчас в теме
Вкратце, если применять левое соединение которое соответствует в плане Nested Loops, то при замене на объединение скорость увеличится в разы для достаточно большой выборки.
10. bulpi 157 16.03.18 12:59 Сейчас в теме
Все , понял, где я туплю. МАКСИМУМ(NULL) будет NULL. Возражения снял.
11. vasilev2015 1418 16.03.18 13:42 Сейчас в теме
(10) я сам долго шел к этой теореме. Сначала я задумался: почему вообще можно заменять соединение на объединение. Потом сообразил, что наборы должны быть уникальными по ключам соединения. Через несколько месяцев догадался, что можно использовать метод мат. индукции для доказательства. И еще через месяц - что нужно исключить NULL из-за его особенностей. Как написано https://technet.microsoft.com/ru-ru/library/ms191270%28v=sql.105%29.aspx
значения NULL всегда считаются равными для ключевых слов ORDER BY, GROUP BY и DISTINCT
хотя (NULL=NULL) всегда ложь.
12. bulpi 157 16.03.18 14:04 Сейчас в теме
Теперь следующий вопрос :
если применять левое соединение которое соответствует в плане Nested Loops, то при замене на объединение скорость увеличится в разы для достаточно большой выборки.


Это не вызывает возражений. Но ведь потом Вы берете группировку и функцию МАКСИМУМ. Это, по идее, должно сожрать весь выигрыш . А может, и нет. Тут нужны тесты!
13. vasilev2015 1418 16.03.18 14:14 Сейчас в теме
(12) этот способ не я придумал. Это из программы подготовки к 1С:Эксперт. Но конечно безоглядно им пользоваться не стоит. Тесты никогда не помешают. Иначе бы операции "левое соединение" не придумали ))
14. bulpi 157 16.03.18 17:50 Сейчас в теме
А я вот не поленился, и протестировал.
Результаты ... хм... неоднозначны.
На 2 таблицы по 100 000 записей выигрыш примерно в 2 раза у объединения .
Взял 2 таблицы на 1 млн записей каждая с частичным пересечением ключей. В результате соединение дало 1.5 млн записей, а объединение (до группировки) - 2 млн записей. И вот эти 2 млн не поместились в физическую оперативную память, началось использование файла подкачки и вуаля! Проигрыш в 1.5 раза. Перевернул порядок тестов, получил все таки выигрыш в 30 %.
Так что идут они лесом с этой программой 1С:Эксперт
15. vasilev2015 1418 16.03.18 21:10 Сейчас в теме
(14) Вы меня спровоцировали, нужно экспертов защищать )). Потестирую тож. Там должны быть условия специальные, например: Первый запрос - две (или более) виртуальные таблицы, обе с индексами, но при соединении должно быть nested loops (соединение циклами) - поэтому медленно. Второй запрос - таблицы объединяем, потом делаем группировки steam aggregate (один проход выборки, используется индекс). Требования по памяти одинаковые.
16. bulpi 157 17.03.18 13:48 Сейчас в теме
(15)
Я не использовал индексы. С индексами картина другая - выигрыш есть, но маленький, около 10% . Не верю , что "Требования по памяти одинаковые.". Похоже, тут закон рычага - выиграли в быстродействии, проиграли в памяти. Если ее хватает с запасом, то все хорошо. Если нет - внезапно проигрыш. Для любого значения ОП можно найти достаточное кол-во записей в таблицах такое, что этот эффект проявится.
vaskomain; +1 Ответить
19. IvSchekin 26.03.18 05:33 Сейчас в теме
(16) нет такого закона в оптимизации запросов как "выиграли в быстродействии, проиграли в памяти".
У запросов прямая зависимость времени выполнения как раз от необходимой памяти.
Если для запроса приходится сканить всю таблицу, то приходится и памяти больше использовать и по этому скорость выполнения растет.

Для скорости выполнения запросов, особенно при соединении таблиц самое важное это наличие индексов по полям по которым осуществляются связи и которые указаны в секции ГДЕ. Индексы увеличивают скорость в десятки разов на больших таблицах.
17. Hatson 365 26.03.18 00:01 Сейчас в теме
Не, Николай)) Я это лайкать не буду ))
24. vasilev2015 1418 02.04.18 11:51 Сейчас в теме
(17) Ну вот, одумался. Поставил лайк. Я заметил.
18. IvSchekin 26.03.18 05:29 Сейчас в теме
(9) Можно пояснить фразу "скорость увеличится в разы для достаточно большой выборки".
Если выборка маленькая что скорость разве не в те же разы увеличится?

В относительных величинах всегда одинаково, а вот в абсолютный действительно будет заметно так в два раза меньше для 10 минутного запроса сильно отличается от уменьшения минутного запроса.
20. vasilev2015 1418 26.03.18 09:08 Сейчас в теме
(18) Скорость увеличивается нелинейно в зависимости от размера выборки.
21. w3bstr 26.03.18 09:39 Сейчас в теме +5.1 $m
23. vasilev2015 1418 02.04.18 10:23 Сейчас в теме
(21) Спасибо за участие, но sm вернул. Мне кажется, так справедливо. Статья получилась узкоспециальная, для широкой публики не подходящая.
22. ildarovich 6733 26.03.18 11:41 Сейчас в теме
Статья интересная, постановка вопроса необычная, есть пища для размышлений...
Оставьте свое сообщение

См. также

"Хочу универсально!" [Часть 1] 65

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

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

02.09.2019    4044    SeiOkami    35       

Иерархия без "В ИЕРАРХИИ" 114

Статья Программист Нет файла v8 Бесплатно (free) Математика и алгоритмы

Говорится о том, как эффективно представлять иерархию в СУБД, как получать и использовать эти представления при решении задач в запросной технике. Уточняются и дополняются запросы из статьи "Уровни, глубина, прародители, циклы и аналоги запросом" [https://infostart.ru/public/160707/].

22.08.2019    4369    ildarovich    16       

EnterpriseData – часть 3. Загрузка данных, идентификация объектов 61

Статья Программист Нет файла v8 v8::УФ 1cv8.cf ОС Бесплатно (free) Практика программирования Математика и алгоритмы Перенос данных из 1C8 в 1C8 Разработка

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

22.08.2019    3430    ids79    7       

Обработчики событий при записи объектов. Зачем и что за чем? 192

Статья Программист Нет файла v8 Бесплатно (free) Математика и алгоритмы

Программисту, имеющему немного опыта на платформе 1С 8.3, бывает сложно разобраться: ПередЗаписью, ПриЗаписи, ПослеЗаписи, на сервере, на клиенте, в модуле формы, в модуле объекта.... Эта шпаргалка была создана в процессе обучения и реального опыта с целью разложить всё по полочкам, чтобы было четкое понимание в каком случае какой обработчик нужно использовать и в какой последовательности они запускаются при записи и проведении документов. Данная статья будет полезна в большей степени начинающим разработчикам. Но и опытным позволит освежить информацию, упорядочить её.

25.07.2019    10594    4    AlbinaAAA    23       

Как проводятся документы в типовых конфигурациях от 1С 135

Статья Программист Нет файла v8::ОУ ERP2 УТ11 Россия УУ Windows Бесплатно (free) Математика и алгоритмы Практика программирования Разработка

В свое время, когда только начинал шаги в 1С и изучал, как проводятся документы в конфигурациях на платформе 1С по книге "Разработка управляемого интерфейса" (Хрусталева Е.Ю.), и там были представлены примеры совсем далекие от того, как сейчас проводятся документы в современных конфигурациях от 1С.

24.07.2019    14997    skv_79    32       

FizzBuzz на 1С. Чем короче, тем веселее. Варианты принимаются... 8

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Математика и алгоритмы Разработка

Мне было скучно, я не мог себя заставить написать ничего полезного. И читал статью на Хабре. Потом я читал комментарии, а потом... нет я не ушел смотреть котиков на ютюбе. Я решил сделать несколько решений задачки FizzBuzz на 1С, с целью "чем короче, тем лучше". Прошу сильно не пинать, это просто развлечение для вечера.

24.07.2019    2614    vandalsvq    16       

Управление качеством кода 126

Статья Программист Руководитель проекта Нет файла v8 Бесплатно (free) Математика и алгоритмы Рефакторинг и качество кода

О SonarQube, АПК, EDT. Какие преимущества дает их использование. Для каких команд подходит.

22.07.2019    7024    Stepa86    23       

Что делает "В ИЕРАРХИИ" в запросе? 86

Статья Программист Нет файла v8 Бесплатно (free) Математика и алгоритмы

Описание действий платформы 1С при использовании конструкции "В ИЕРАРХИИ" в запросах.

16.07.2019    6738    YPermitin    29       

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

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

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

25.06.2019    17684    ids79    17       

Реализуем Стек, Очередь и Приоритетную очередь в 1С 51

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

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

24.06.2019    7207    RonX01    63       

Организация хранения промежуточных данных 3

Статья Программист Нет файла v8 Бесплатно (free) Математика и алгоритмы

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

29.05.2019    1751    scientes    1       

Вычисление 200 тысяч знаков числа pi 73

Статья Программист Нет файла v8 Россия Бесплатно (free) Математика и алгоритмы

В статье рассматриваются возможности платформы выполнять сверхточные вычисления без использования сложных алгоритмов и внешних компонент на примере вычисления числа pi.

28.05.2019    3643    Oleg_nsk    93       

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

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

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

20.05.2019    9925    YPermitin    4       

Даем названия переменным: как префиксы экономят наше время 10

Статья Программист Стажер Внешняя обработка (ert,epf) v8 Бесплатно (free) Практика программирования Математика и алгоритмы Разработка

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

06.05.2019    2959    Designer1C    69       

Заметки по SQL: Срез последних - аналог запроса 15

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

В статье описывается создание среза последних данных средствами классического языка запросов. Причем метод построения запроса был разработан еще во времена, когда автор работал с СУБД Oracle 9i и программировал на PL SQL. Основная идея заключается преобразовании запроса с подзапросом, в запрос без подзапроса (в примерах описывается преобразование до двух вложенных подзапросов). Запросы тестировались на реальных базах данных. Платформа - 1С:Предприятие 8.3 (8.3.10.2561).

15.01.2019    5897    IVC_goal    5       

Короткое нагрузочное тестирование PostgreSQL простыми запросами 25

Статья Системный администратор Программист Архив с данными v8::УФ Windows Абонемент ($m) Производительность и оптимизация (HighLoad)

Короткое нагрузочное тестирование PostgreSQL простыми запросами. Прилагаются результаты в файлах pgBadger и perfmon.

1 стартмани

10.12.2018    6481    1    vasilev2015    22       

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

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

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

10.11.2018    20953    ids79    40       

Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C 144

Статья Программист Нет файла v8 Россия Бесплатно (free) Математика и алгоритмы Практика программирования

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

23.08.2018    21404    Rain88    42       

Введение в CI для 1С 87

Статья Программист Нет файла v8 Россия Бесплатно (free) Математика и алгоритмы

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

21.11.2017    18891    real_MaxA    22       

Как работает серверный вызов в 1С 456

Статья Программист Нет файла v8::УФ Бесплатно (free) Математика и алгоритмы

Клиент-серверная архитектура заложена в платформе изначально — со времен «1С:Предприятие 8.0». Однако при разработке на 8.0 и 8.1 о разделении кода на клиентскую и серверную часть можно было не заботиться, поскольку на клиенте (на толстом клиенте) был доступен тот же функционал, что и на сервере. Всё изменилось с выходом платформы «1С:Предприятие 8.2», когда появился тонкий клиент. Теперь на клиенте доступен один функционал, на сервере — другой. Клиент и сервер «общаются» между собой с помощью серверного вызова. Конечно, это усложнило процесс разработки, но с другой стороны – можно создавать более оптимальные (быстрые) решения, поскольку все сложные задачи выполняются на сервере.

18.11.2017    42997    pahich    75       

#Область ВНЕШНИЕ_ВЫЗОВЫ или MVC в 1С, библиотечность и упрощение интеграции кода 43

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

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

12.10.2017    14491    for_sale    58       

Групповая разработка конфигураций в крупном холдинге 68

Статья Программист Нет файла v8 Бесплатно (free) Математика и алгоритмы

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

15.08.2017    17101    stas_ganiev    15       

Автоматизация процесса 1С-разработки 91

Статья Программист Нет файла v8 Бесплатно (free) Математика и алгоритмы

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

07.06.2017    22604    ekaruk    9       

Пишем игру Минер. Обработка событий ActiveX в 1С 29

Статья Программист Нет файла v8 Россия Windows Бесплатно (free) Практика программирования Математика и алгоритмы

Пример демонстрирует обработку событий генерируемых компонентой ActiveX в 1С.

29.05.2017    12448    user621724_Dimav1979    11       

Как я доступ на kb.1c.ru получал 91

Статья Программист Нет файла v8 Россия Бесплатно (free) Решение задач на 1С:Специалист Математика и алгоритмы

kb.1c - база знаний по технологическим вопросам крупных внедрений и не только. В этой базе знаний собираются методики и решения технологических проблем эксплуатации 1с, check-list'ы и инструкции по настройке ПО на серверах. Какие-то из размещенных статей дублируются на ИТС. Когда я искал пути получения доступа к нему я столкнулся с проблемой: мало кто доподлинно знает как получить доступ к нему, не работая у франчайзи 1с. Я опишу путь, который прошёл я, как физическое лицо.

01.05.2017    22135    ikekoval    33       

Улучшение стандарта "Структура модуля" 6

Статья Программист Нет файла v8 1cv8.cf Россия Бесплатно (free) Математика и алгоритмы

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

26.03.2017    11992    o.nikolaev    23       

"Распределение в запросе" или "избавляемся от перебора" 184

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

Хороший перебор - это отсутствие перебора. Рассмотрим пример замены полного перебора запросом.

16.12.2016    27902    alexandersh    45       

Планы обмена. Квитировать или гарантировать? 24

Статья Программист Нет файла v8 1cv8.cf Бесплатно (free) Практика программирования Математика и алгоритмы

Планы обмена предлагают использовать две стратегии удаления обработанных изменений: квитирование и гарантированная доставка сообщений. Как сделать правильный выбор?

12.12.2016    14234    zhichkin    9       

Некоторые принципы оптимизации запросов 1С (+SQL) 115

Статья Программист Нет файла v8 Бесплатно (free) Математика и алгоритмы

Разработка нового функционала часто связана с созданием новых таблиц в базе и написанием запросов. Собственно, размышляя о запросах, мы и формируем в голове содержание таблиц, индексы и количество таблиц и индексов. Заранее можно уверенно рассуждать о том, какая нужна архитектура, если задачу удалось понять. На этом этапе важно привлекать свой опыт. Что же делать, если его нет? Как рассуждать о запросах и формате хранения?

17.11.2016    8657    ture    40       

Использование git для доработки типовых конфигураций 1С 230

Статья Программист Нет файла v8 Беларусь Украина Россия Бесплатно (free) Математика и алгоритмы

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

11.10.2016    186414    pumbaE    31       

Оптимизация запросов 1С:Предприятие – от теории к практике 114

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Математика и алгоритмы

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

07.10.2016    31243    bpc222    20       

Регистры сведений 1С. Как это устроено. 714

Статья Программист Нет файла v8 Бесплатно (free) Математика и алгоритмы

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

05.08.2016    147313    Sergey.Noskov    154       

Переводим расширения на 8.3.8. Памятка. 79

Статья Программист Нет файла v8 Россия Бесплатно (free) Практика программирования Математика и алгоритмы

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

29.07.2016    38986    mrXoxot    12       

Опыт практического применения методики BDD на 1С. Написание сценариев 121

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Математика и алгоритмы

Эта статья открывает цикл публикаций, в которых я хочу поделиться опытом использования методики BDD при разработке на 1С. В этой статье речь пойдёт о написании сценариев.

03.07.2016    20037    oleynik.dv    132       

Заметки про запросы. Последовательность. 109

Статья Программист Нет файла v8 Windows Бесплатно (free) Математика и алгоритмы Практика программирования

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

27.05.2016    29087    vasilev2015    31       

Оптимизация планирования доставки грузов. Алгоритм кластеризации k-means (метод K-средних). 26

Статья Программист Нет файла v8 УТ10 УПП1 Windows Бесплатно (free) Математика и алгоритмы

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

10 стартмани

09.02.2016    26122    mi1man    4       

Контур.EDI изнутри, или история командной разработки тиражного продукта на 1С 174

Статья Программист Нет файла v8 Россия УУ Windows Оптовая торговля Бесплатно (free) Интеграция Практика программирования Математика и алгоритмы

“Система - больше, чем просто совокупность ее элементов”; “Несколько разработчиков - это еще не команда разработки”. Расскажу, как мы прочувствовали эти очевидные утверждения на своей шкуре.

17.11.2015    35551    skif47    88       

Порядок записи движений регистров при проведении документа 94

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Математика и алгоритмы

Когда-то была программа 1С седьмой версии, и все программисты знали: если нужно проанализировать и/или исправить движения документа - смотри модуль документа, процедура ОбработкаПроведения(). В 1С 8 все гораздо сложнее. Кроме модуля проведения есть еще подписки на события, а также движения документа может "создавать" не сам документ. Эта статья о том, как происходит проведение и в какой момент записываются движения документа по регистрам.

13.11.2015    78684    triton_tver    8       

.NET(C#) для 1С. Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия 51

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

Динамическая компиляция класса обертки для использования .Net событий в 1С через ДобавитьОбработчик или ОбработкаВнешнегоСобытия, а так же генерация модулей на C# и 1С для подключения к событиям. Использование DynamicMethod и ILGenerator. Представлены примеры для использовании событий System.IO.FileSystemWatcher (Ожидает уведомления файловой системы об изменениях и инициирует события при изменениях каталога или файла в каталоге.) и SerialPort (обработка сканера штрих кода подключенного к COM порту). Обертка позволяет использовать классы .Net только на языке 1С. Реализация 1C Messenger описанного здесь http://infostart.ru/public/434771/

12.11.2015    41728    Serginio    35       

Три способа получить дерево элементов иерархического справочника 50

Статья Программист Нет файла v8 Бесплатно (free) Математика и алгоритмы

Рассматривается применимость и недостатки следующих способов получения дерева 1) Запрос с использованием итогов по иерархии 2) Формирование дерева обходом выборки с упорядочиванием по иерархии 3) Формирование иерархии по списку элементов транзитивным замыканием

11.11.2015    61591    32ops    9       

Мультиинструментальный Brute Force 4

Статья Программист Нет файла v8 Windows Бесплатно (free) Математика и алгоритмы

Решение задачи из Project Euler с помощью 1С, а также дополнительных программ, серверов и прочих хитростей.

30.10.2015    10259    scientes    4       

1С с "плюсами" 74

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

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

14.10.2015    19654    IntelInside    47       

Знакомство с технологией Automation-сервер на примерах 33

Статья Программист Нет файла v8 Windows Бесплатно (free) Математика и алгоритмы

В статье рассмотрены принципы работы технологии Automation-сервер на конкретных примерах.

28.09.2015    25716    niko11s    10       

Критерии отбора 82

Статья Программист Нет файла v8 1cv8.cf Windows Бесплатно (free) Математика и алгоритмы

Статья посвящена объекту конфигурации - критерий отбора. Поговорим о сущности этого объекта и о методах работы с ним.

24.09.2015    48500    niko11s    13       

По ссылке или по значению? Ключевое слово Знач и с чем его едят 196

Статья Программист Нет файла v8 Бесплатно (free) Практика программирования Математика и алгоритмы

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

12.08.2015    36337    Evil Beaver    239