Сортировка в 1с 8.3. Алгоритм "Сортировка пузырьком"

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


Рис. 1

Списки

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

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

Рис. 1

Механизм сортировки

Для чего нужен механизм сортировки? Во-первых, он, как следует из названия, позволяет отсортировать список по нужному критерию.

Во-вторых, в платформе "1С:Предприятие 8.1" активно используется механизм быстрого поиска. Этот механизм позволяет быстро найти в каком-либо списке нужный элемент, набрав первые символы (рис. 2). Но в динамических списках (например, список элементов справочника или список документов) быстрый поиск работает только по реквизитам, по которым доступна сортировка.

Рис. 2

Посмотреть все доступные для сортировки реквизиты списка можно, открыв окно "Отбор и сортировка". Это окно, как правило, доступно на панели действий (рис. 3) либо в контекстном меню списка, открывающемся правой кнопкой мыши (рис. 4). В окне "Отбор и сортировка" нужно перейти на закладку "Сортировка", где показаны все доступные реквизиты, по которым возможна сортировка.

Рис. 3

Рис. 4

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

Рис. 5

Заметим, что нижний пример иллюстрирует возможность использования комбинированной сортировки (одновременно по нескольким реквизитам). В нашем случае, это сортировка по дате по убыванию (самые старые даты внизу) и по номерам по возрастанию (самые большие номера внизу).

В каждом списке можно индивидуально сохранить нужную сортировку. Достаточно включить галочку "Использовать эту настройку сортировки при открытии" и нажать "ОК". Система запомнит настройку и при следующем открытии этого списка установит сохраненную сортировку.

Быстро отсортировать список по нужному реквизиту можно, щелкнув мышкой по шапке с названием этого реквизита.

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

Механизм отбора

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

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

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

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

Механизмы отбора и сортировки на примерах

Попробуем решить несколько задач в демонстрационной базе ("Бухгалтерия предприятия", редакция 1.6). Например, отобразим документы, сформированные для контрагента "Саймон и Шустер ООО" в журнале "Документы покупателей". Сразу оговоримся, что описывать будем стандартные для платформы "1С:Предприятие 8.1" правила и логику ведения отбора, без привязки к какой-либо конкретной конфигурации и дополнительным сервисным возможностям, в ней реализованным.

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

Нам нужно быстро посмотреть все документы контрагента "Саймон и Шустер ООО". Реализуется задача следующим образом - открывается окно отбора, в элементе "Контрагент" выбирается контрагент "Саймон и Шустер ООО" из справочника (рис. 6) и нажимается "ОК". Задача решена (рис. 7).

Рис. 6

Рис. 7

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

Обратите внимание еще и на то, что при указании значений в элементах отбора (в нашем примере - контрагент "Саймон и Шустер ООО"), в большинстве случаев будет работать механизм быстрого подбора, широко распространенный в платформе "1С:Предприятие 8.1". В нашем примере достаточно было набрать первые символы названия контрагента или его код прямо в поле значения отбора, нажать Enter или Tab и система автоматически бы "угадала" нужный нам элемент справочника.

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

Теперь отобразим список номенклатуры, в наименованиях которых содержится слово "Чайник". Для этого открываем справочник "Номенклатура", вызываем окно отбора, в элементе "Наименование" выбираем условие сравнения "Содержит" и указываем требуемое слово (рис. 8).

Рис. 8

Вид сравнения "Содержит" выбран не случайно. Именно он позволяет найти нужное слово (или его часть) в любом месте наименования номенклатуры. Если оставить вид сравнения "Равно", в списке будут отображены только такие элементы номенклатуры, которые называются точно так, как написан запрос. А таких в нашей демобазе нет (то есть не было бы отображено ни одного элемента).

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

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

Рис. 9

Для удобства работы с элементами справочника при использовании отборов лучше на время отключать отображение иерархии (рис. 10).

Рис. 10

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

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

Рис. 11

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

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

У задачи существует несколько способов реализации. Рассмотрим наиболее эффективный. Открываем журнал "Документы покупателей", указываем в элементе отбора "Вид документа" документ "Счет-фактура выданный". После этого в элементе отбора "Контрагент" указываем вид сравнения "В группе". Выбираем тип значения "Контрагенты" и открываем форму выбора контрагентов. В ней выбираем группу "Покупатели" (рис. 12).

Рис. 12

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

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

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

Рис. 13

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

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

И, наконец, отобразим в документе "Реализация товаров и услуг" с номером ТДН00002 в табличной части только номенклатуру, содержащую в наименованиях слово "СТИНОЛ". Эта задача, позволит увидеть универсальность самого механизма отбора, а также насколько разнообразно может быть его использование. Задача основана на реальных ситуациях, когда, например, в табличной части накладной несколько сотен (а то и тысяч) строк и надо быстро проанализировать ее состав. В нашей демобазе есть документ "Реализация товаров и услуг" с номером ТДН00002, у которого в табличной части есть несколько строк. Несмотря на то что в документе кнопок использования отборов не наблюдается, вызов отбора доступен через контекстное меню (правая кнопка мыши).

Далее накладываем критерии отбора в разрезе Номенклатуры. Тут же возникает другой вопрос - как отобрать "СТИНОЛ", если условия выбора номенклатуры довольно сильно ограничены (доступно "Равно", "Не равно", "В списке" и "Не в списке"). Решить задачу можно и при таких условиях. Выбираем условие "В списке", открываем уже знакомое окно заполнения списка, используем подбор номенклатуры (рис. 14, 1). В списке номенклатуры может быть большое количество элементов, поэтому не будем искать глазами нужные позиции. Воспользуемся отбором в списке номенклатуры, указав условие отбора "Содержит" для наименования номенклатуры (рис. 14, 2).

Рис. 14

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

Полезные функции механизма отбора

Рассмотрим еще несколько моментов, связанных так или иначе с отборами в системе "1С:Предприятие 8.1".

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

Рис. 15

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

Рис. 16

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

Рис. 17

Рис. 18

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

Рис. 19

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

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

1.Алгоритм "Сортировка выбором".

Является одним из самых простых алгоритмов сортировки массива. Смысл в том, чтобы идти по массиву и каждый раз искать минимальный элемент массива, обменивая его с начальным элементом неотсортированной части массива. На небольших массивах может оказаться даже эффективнее, чем более сложные алгоритмы сортировки, но в любом случае проигрывает на больших массивах. Число обменов элементов по сравнению с "пузырьковым" алгоритмом N/2, где N - число элементов массива.

Алгоритм:
1. Находим минимальный элемент в массиве.
2. Меняем местами минимальный и первый элемент местами.
3. Опять ищем минимальный элемент в неотсортированной части массива
4. Меняем местами уже второй элемент массива и минимальный найденный, потому как первый элемент массива является отсортированной частью.
5. Ищем минимальные значения и меняем местами элементы,пока массив не будет отсортирован до конца.

//Сортировка выбором {--- Функция СортировкаВыбором(Знач Массив) Мин = 0; Для i = 0 По Массив.ВГраница() Цикл Мин = i; Для j = i + 1 ПО Массив.ВГраница() Цикл //Ищем минимальный элемент в массиве Если Массив[j] < Массив[Мин] Тогда Мин = j; КонецЕсли; КонецЦикла; Если Массив [Мин] = Массив [i] Тогда //Если мин. элемент массива = первому элементу неотс. части массива, то пропускаем. Продолжить; КонецЕсли; Смена = Массив[i]; //Производим замену элементов массива. Массив[i] = Массив[Мин]; Массив[Мин] = Смена; КонецЦикла; Возврат Массив; КонецФункции

2.Алгоритм "Сортировка пузырьком".

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

Алгоритм:
1. Каждый элемент массива сравнивается с последующим и если элемент[i] > элемент происходит замена. Таким образом самые "легкие" элементы "всплывают" - перемещаются к началу списка,а самые тяжелые "тонут" - перемещаются к концу.
2. Повторяем Шаг 1 n-1 раз, где n - Массив.Количество ().

//Сортировка пузырьком {--- Функция СортировкаПузырьком(Знач Массив) Для i = 0 По Массив.ВГраница() Цикл Для j = 0 ПО Массив.Вграница() - i - 1 Цикл Если Массив[j] > Массив Тогда Замена = Массив[j]; Массив[j] = Массив; Массив = Замена; КонецЕсли; КонецЦикла; КонецЦикла; Возврат Массив; КонецФункции //---}

3.Алгоритм "Шейкерная сортировка"(Сортировка перемешиванием,Двунаправленная пузырьковая сортировка).

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

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

В приведенном ниже примере, есть усовершенствование в шейкерной сортировке. В отличие от классической, используется в 2 раза меньше итераций.

//Сортировка перемешивание (Шейкер-Сортировка) {--- Функция СортировкаПеремешиванием(Знач Массив) Для i = 0 ПО Массив.ВГраница()/2 Цикл нИтер = 0; конИтер = Массив.ВГраница(); Пока нИтер Массив[нИтер+1] Тогда Замена = Массив[нИтер]; Массив[нИтер] = Массив[нИтер + 1]; Массив[нИтер + 1] = Замена; КонецЕсли; нИтер = нИтер + 1;//Двигаем позицию на шаг вперед //Проходим с конца Если Массив[конИтер - 1] > Массив[конИтер] Тогда Замена = Массив[конИтер - 1]; Массив[конИтер-1] = Массив[конИтер]; Массив[конИтер] = Замена; КонецЕсли; конИтер = конИтер - 1;//Двигаем позицию на шаг назад КонецЦикла; КонецЦикла; Возврат Массив; КонецФункции //---}

4. Алгоритм "Гномья сортировка".

Алгоритм так странно назван благодаря голландскому ученому Дику Груну.

Гномья сортировка основана на технике, используемой обычным голландским садовым гномом (нидерл. tuinkabouter). Это метод, которым садовый гном сортирует линию цветочных горшков. По существу он смотрит на следующий и предыдущий садовые горшки: если они в правильном порядке, он шагает на один горшок вперёд, иначе он меняет их местами и шагает на один горшок назад. Граничные условия: если нет предыдущего горшка, он шагает вперёд; если нет следующего горшка, он закончил.
Дик Грун

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

//Гномья сортировка {--- Функция ГномьяСортировка(Знач Массив) i = 1; j = 2; Пока i < Массив.Количество() Цикл // Сравнение < - Сортировка по возрастанию, > - по убыванию Если Массив i = j; j = j + 1; Иначе Замена = Массив[i]; Массив[i] = Массив; Массив = Замена; i = i - 1; Если i = 0 Тогда i = j; j = j + 1; КонецЕсли; КонецЕсли; КонецЦикла; Возврат Массив; КонецФункции //---}

5. Алгоритм "Сортировка вставками".

Представляет собой простой алгоритм сортировки. Смысл заключается в том, что на каждом шаге мы берем элемент, ищем для него позицию и вставляем в нужное место.
Элементарный пример: При игре в дурака, вы тянете из колоды карту и вставляете ее в соответствующее место по возрастанию в имеющихся у вас картах. Или
в магазине вам дали сдачу 550 рублей- одна купюра 500, другая 50. Заглядываете в кошелек, а там купюры достоинством 10,100,1000. Вы вставляете купюру
достоинсвом 50р. между купюрами достоинством 10р и 100р, а купюру в 500 рублей между купюрами 100р и 1000р. Получается 10,50,100,500,1000 - Вот вам
и алгоритм "Сортировка вставками".
Таким образом с каждым шагом алгоритма, вам необходимо отсортировать подмассив данных и вставить значение в нужное место.


//Сортировка вставками {--- Функция СортировкаВставками(Знач Массив) Для i = 0 По Массив.ВГраница()-1 Цикл Ключ = i + 1; Замена = Массив[Ключ]; j = i + 1; Пока j > 0 И Замена < Массив Цикл Массив[j] = Массив; Замена = j - 1; Ключ = j - 1; j = j - 1; КонецЦикла; Массив[Ключ] = Замена; КонецЦикла; Возврат Массив; КонецФункции //---}

6. Алгортим "Сортировка слиянием".

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

p/s не смог вставить сюда рисунок с более наглядной схемой, постоянно размазывается. Зато хорошо видна в блоке скриншотов внизу. Можно посмотреть как работает алгоритм.

//Сортировка слиянием {---

Функция СортировкаСлиянием(Знач Массив) Если Массив.Количество() = 1 Тогда Возврат Массив; КонецЕсли; ТочкаРазрыв = Массив.Количество() / 2; лМассив = Новый Массив; прМассив = Новый Массив; Для Сч = 0 ПО Массив.ВГраница() Цикл Если Сч < ТочкаРазрыв Тогда лМассив.Добавить(Массив[Сч]); Иначе прМассив.Добавить(Массив[Сч]); КонецЕсли; КонецЦикла; Возврат Слияние(СортировкаСлиянием(лМассив),СортировкаСлиянием(прМассив)); КонецФункции Функция Слияние(массив1,массив2) a = 0; b = 0; слМассив = Новый Массив; Для Сч = 0 ПО (Массив1.Количество() + Массив2.Количество())-1 Цикл слМассив.Добавить(); КонецЦикла; Для i = 0 ПО (массив1.Количество() + массив2.Количество())-1 Цикл Если b < массив2.Количество() И a < массив1.Количество() Тогда Если (массив1[a] > массив2[b]) И (b < массив2.Количество()) Тогда слМассив[i] = массив2[b]; b = b + 1; Иначе слМассив[i] = массив1[a]; a = a + 1; КонецЕсли; Иначе Если b < массив2.количество() Тогда слМассив[i] = массив2[b]; b = b + 1; Иначе слМассив[i] = массив1[a]; a = a + 1; КонецЕсли; КонецЕсли; КонецЦикла; Возврат слМассив; КонецФункции //---}

7. Алгортим "Сортировка Шелла".

Алгоритм назван так в честь американского ученого Дональда Шелла. По своей сути этот алгоритм является усовершенствованным алгоритмом "Сортировка вставками". Смысл алгоритма заключается в том, чтобы сравнивать не только элементы, стоящие рядом друг с другом, но и на некотором удалении. Сначало выбирается Шаг - некий промежуток, через который будут сравниваться элементы массива на каждой итерации. Обычно его определяют так:
Для первой итерации Шаг = Цел(Массив.Количество()/2), для последующих Шаг = Цел(Шаг/2). Т.е. постепенно шаг сокращается и когда Шаг будет равен 1 произойдет последние сравнение и массив будет отсортирован.

Пример:
Дан массив (10,5,3,1,14,2,7,12).
1. Шаг = 4.
Сортируем простыми вставками каждые 4 группы по 2 элемента (10,14)(5,2)(3,7)(1,12)

10 ,2 ,3 ,1,14 ,5 ,7 ,12

2. Шаг = 2
Сортируем простыми вставками каждые 2 группы по 4 элемента (10,3,14,7)(2,1,5,12)

3 ,1 ,7 ,2 ,10 ,5 ,14 ,12

3. Шаг = 1
Сортируем простыми вставками каждую 1 группу по 8 элементов.

1,2,3,5,7,10,12,14


//Сортировка Шелла {--- Функция СортировкаШелла(Знач Массив) Шаг = Цел(Массив.Количество()/2); Пока Шаг > 0 Цикл i = 0; Пока i < (Массив.Количество() - Шаг) Цикл j = i; Пока j >= 0 И Массив[j] > Массив Цикл Замена = Массив[j]; Массив[j] = Массив; Массив = Замена; j = j - 1; Если ПрименитьОтображениеСортировки Тогда ОтобразитьДиаграммуСортировки(Массив); КонецЕсли; КонецЦикла; i = i + 1; КонецЦикла; Шаг = Цел(Шаг/2); ОбработкаПрерыванияПользователя(); КонецЦикла; Возврат Массив; КонецФункции //---}

8. Алгортим "Быстрая сортировка".

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

//Алгоритм "Быстрая сортировка" { Процедура б_Сортировка(Массив,НижнийПредел,ВерхнийПредел) i = НижнийПредел; j = ВерхнийПредел; m = Массив[Цел((i+j)/2)]; Пока Истина Цикл Пока Массив[i] < m Цикл i = i + 1; КонецЦикла; Пока Массив[j] > m Цикл j = j - 1; КонецЦикла; Если i > j Тогда Прервать; КонецЕсли; КонецЦикла; Если НижнийПредел < j Тогда б_Сортировка(Массив,НижнийПредел,j); КонецЕсли; Если i < ВерхнийПредел Тогда б_Сортировка(Массив,i,ВерхнийПредел); КонецЕсли; КонецПроцедуры Функция БыстраяСортировка(Массив) НижняяГраница = 0; ВерхняяГраница = Массив.ВГраница(); б_Сортировка(Массив,НижняяГраница,ВерхняяГраница); Возврат Массив; КонецФункции //---}

9. Классическая сортировка массива в 1с.

Передаем массив в список значений. Сортируем стандартным методом "Сортировать".

//Сортировка списком значений {--- Функция СортировкаСпискомЗначений(Знач Массив) мСписокЗнч = Новый СписокЗначений; мСписокЗнч.ЗагрузитьЗначения(Массив); мСписокЗнч.СортироватьПоЗначению(НаправлениеСортировки.Возр); Возврат мСписокЗнч.ВыгрузитьЗначения(); КонецФункции //---}


Все сортировки можно ускорить расположив код в циклах в 1 строку. Но для читабельности, оставил так.


Написал обработку в которой реализованы все вышеперечисленные алгоритмы, также поддерживается динамическая анимация процесса сортировки (Кроме стандартной сортировки 1с).

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

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

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

0. Об ошибке

2. Изменение кодовой страницы ИБ

Если Вы работаете в 1С:Предприятие локально, либо используете 1С в под управлением любой версии, эту ошибку можно исправить следующим образом:

Запускаем 1С:Предприятие в режиме конфигуратор, далее в меню выбираем пункт «Администрирование » — «Кодовая страница ИБ ».

В открывшемся окне выбираем в списке, в самом низу «+Текущая системная установка » и нажимаем «ОК ».

Дожидаемся окончания переиндексации и спокойно работаем с информационной базой.

3. Создание файла ordnochk.prm

Если же пользователи работают с 1С:Предприятие 7.7. с компьютеров в сети под управлением различных версий Windows (например Windows XP и Windows 7), либо Вы работаете с одной базой данных на разных компьютерах, допустим дома и в офисе, в случае когда база данных находиться на съемном носителе, тогда следует создать файл «ordnochk.prm » и поместить его в корневую папку с установленной 1С:Предприятие (по умолчанию это «C:\Program Files\1Cv77\BIN\ »). Этот файл отключит проверку сортировки.

Создать его не так сложно. Создаем пустой файл с помощью программы блокнот и переименовываем его в ordnochk.prm , при этом с .txt на .prm

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

Помогла ли Вам данная статья?

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

Механизм сортировки в системе 1С

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

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

Для того чтобы сохранить индивидуальную сортировку для каждого списка, следует установить флажок возле пункта «Использовать эту настройку при открытии». Программа 1С: Предприятие запомнит заданное свойство, и когда пользователь в следующий раз откроет список – система выдаст ему перечень документов, соответствующий заданным реквизитам. Если надо быстро отсортировать список по необходимым параметрам, следует щелкнуть мышкой по наименованию реквизита (например, «Дата»). После этого произойдет автоматическое переключение на поиск документов по дате.

Последовательность настройки отбора и сортировки

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

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

3. Перейти на закладку «Сортировка» для установки порядка отображения упорядоченных данных. Необходимые параметры следует перенести из правой части таблицы в левую, направление сортировки устанавливается кнопкой с двумя стрелками. Сохранить выполненные настройки.

4. Внешний вид списка также можно настроить, тогда пользователю будет удобнее работать с ним. Чтобы открыть окно настроек, надо нажать комбинацию «Действия» − «Настройка списка». На вкладке «Колонки» отметить флажками требуемые наименования, при помощи кнопок со стрелками задать порядок их отображения и размеры. Сохранить настройки.

5. На вкладке «Прочее» установить галочки возле необходимых позиций.

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

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

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

2. Форма списка открывается без определения реквизитов, в обработчике событий прописывается код, предназначенный для сортировки документов в динамическом списке. Реквизит «ВидСравнения» можно указывать не только «Равно», но и «Меньше», «Больше». Отрицательным моментом использования данного метода является то, что форма всегда будет открываться с таким отбором. Во избежание этого не стоит назначать ее основной.

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

Подключение внешних печатных форм

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

    В программе 1С: Предприятие открыть пункт меню «Сервис» − «Дополнительные отчеты и обработки» − «Внешние печатные формы». Открыть в системе требуемый файл.

    Указать документ, к которому относится данная печатная форма, нажать «OK».

    В перечне доступных печатных форм должно появиться новое наименование.

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

Менеджер временных таблиц в 1С

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

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

Точка актуальности и граница итогов в 1С

Точка актуальности (ТА) в программе 1С – это период, на который оперативные итоги остаются актуальными. ТА всегда должна соответствовать текущей дате, в системе она автоматически обновляется каждый день. Пользователь может получить итоги по бухгалтерским операциям за любой промежуток времени, находящийся перед точкой актуальности. При необходимости ТА переставляется на другую дату вручную, для этого надо зайти в пункт меню «Операция», затем «Управление оперативными итогами» и установить требуемую дату.

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

Установка прав для роли в системе 1С

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

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

При внедрении программы 1С: Предприятие 7.7 на компьютер, где установлена ОС Windows 7, порядок сортировки выполняется некорректно. Это объясняется различием настроек бухгалтерского программного обеспечения и операционной системы. Специалисты компаний, устанавливающих 1С, знают об этой проблеме и заранее предупреждают клиентов. Несколько новых версий 1С предназначены специально для ОС Linux Ubuntu, поэтому стоит задуматься о внедрении этой операционной системы.

Установка конфигурации 1С на ОС Ubuntu

1. Скачать операционную систему с официального сайта и установить ее на компьютер.

2. Архивы с клиентской и серверной частью платформы 1С: Предприятие распаковать и переместить в одну папку.

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

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

5. Загрузить информационную базу и можно приступать к работе.

Если вы твердо решили для себя: «Для повышения эффективности ведения бухгалтерского учета мне надо установить программу 1С: Бухгалтерия» − вы на правильном пути. Конфигурация позволяет быстро решать ряд повседневных задач по автоматизации бизнеса. Внедрив программное обеспечение с мощным функционалом, вы получите эффективный инструмент для обработки первичных документов, финансовых и бухгалтерских отчетов.

/// определенным полям в 1с 8.3, 8.2 &НаСервере Процедура КакУпорядочитьРезультатЗапросаПоПолямНаСервере() // Чтобы сортировать строки в результате запроса // используется секция УПОРЯДОЧИТЬ ПО. // Требуется вывести продукты, упорядоченные // сначала по возрастанию цвета, а затем // по убыванию калорийности. Запрос = Новый Запрос( "ВЫБРАТЬ | Наименование, | Цвет, | Калорийность |ИЗ | Справочник.Номенклатура |УПОРЯДОЧИТЬ ПО | Цвет ВОЗР, | Калорийность УБЫВ" /// Как упорядочить результат запроса по /// выражению в 1с 8.3, 8.2 &НаСервере Процедура КакУпорядочитьРезультатЗапросаПоВыражениюНаСервере() // В секции УПОРЯДОЧИТЬ ПО можно использовать // выражения. // Например, упорядочим продукты по // максимальному содержанию белков и углеводов // вместе. Запрос = Новый Запрос( "ВЫБРАТЬ | Наименование, | Белки, | Углеводы, | Жиры, | Вода |ИЗ | Справочник.Номенклатура |УПОРЯДОЧИТЬ ПО | (Белки + Углеводы) УБЫВ" ) ; ВыполнитьЗапросИВывестиНаФорму(Запрос) ; КонецПроцедуры /// Как упорядочить результат запроса по /// иерархии в 1с 8.3, 8.2 &НаСервере Процедура КакУпорядочитьРезультатЗапросаПоИерархииНаСервере() // Для таблиц, для которых задано свойство иерархичности // возможно упорядочивание в соответствии с иерархией. // К примеру, сделаем вывод элементов из // справочника "Номенклатура" в порядке // их следования в иерархии справочника. Запрос = Новый Запрос( "ВЫБРАТЬ | Наименование |ИЗ | Справочник.Вкусы КАК Вкусы |УПОРЯДОЧИТЬ ПО | Наименование Иерархия" ) ; ВыполнитьЗапросИВывестиНаФорму(Запрос) ; КонецПроцедуры /// Как упорядочить результат запроса по /// агрегатной функции группировки в 1с 8.3, 8.2 &НаСервере Процедура КакУпорядочитьРезультатЗапросаПоАгрегатнойФункцииНаСервере() // В секции УПОРЯДОЧИТЬ ПО также возможно использование // агрегатных функций, которые были использованы для // группировки результата запроса. // Для каждого цвета - выберем минимальную калорийность // продукта, имеющиего такой цвет. А затем отсортируем // результат по возрастанию этой минимальной калорийности. Запрос = Новый Запрос( "ВЫБРАТЬ | Цвет, | МИНИМУМ(Калорийность) |ИЗ | Справочник.Номенклатура |СГРУППИРОВАТЬ ПО | Цвет |УПОРЯДОЧИТЬ ПО | МИНИМУМ(Калорийность) ВОЗР" ) ; ВыполнитьЗапросИВывестиНаФорму(Запрос) ; КонецПроцедуры /// Как работает автоупорядочивание результата /// в 1с 8.3, 8.2 &НаСервере Процедура КакРаботаетАвтоупорядочиваниеНаСервере() // Предложение АВТОУПОРЯДОЧИВАНИЕ позволяет включить режим // автоматического формирования полей для упорядочивания // результата запроса. // Автоупорядочивание работает по следующим принципам: // Если в запросе было указано предложение УПОРЯДОЧИТЬ ПО, // то каждая ссылка на таблицу, находящаяся в этом предложении, // будет заменена полями, по которым по умолчанию сортируется таблица // (для справочников это код или наименование, для документов – дата // документа). Если поле для упорядочивания ссылается на иерархический справочник, // то будет применена иерархическая сортировка по этому справочнику. // Если в запросе отсутствует предложение УПОРЯДОЧИТЬ ПО, // но есть предложение ИТОГИ, тогда результат запроса будет // упорядочен по полям, присутствующим в предложении // ИТОГИ после ключевого слова ПО, в той же последовательности и, // в случае если итоги рассчитывались по полям – ссылкам, // то по полям сортировки по умолчанию таблиц, на которые были ссылки. // Если в запросе отсутствуют предложения УПОРЯДОЧИТЬ ПО и ИТОГИ, // но есть предложение СГРУППИРОВАТЬ ПО, тогда результат запроса // будет упорядочен по полям, присутствующим в предложении, // в той же последовательности и, в случае если группировка велась // по полям – ссылкам, то по полям сортировки по умолчанию таблиц, // на которые были ссылки. // В случае же, если в запросе отсутствуют предложения и // УПОРЯДОЧИТЬ ПО, ИТОГИ и СГРУППИРОВАТЬ ПО, результат будет // упорядочен по полям сортировки по умолчанию для таблиц, // из которых выбираются данные, в порядке их появления в запросе. // В случае, если запрос содержит предложение ИТОГИ, каждый уровень // итогов упорядочивается отдельно. // В примере ниже мы сортируем по полю Ссылка и используем // ключевое слово АВТОУПОРЯДОЧИВАНИЕ. Система при этом // заменит поле Ссылка в секции УПОРЯДОЧИТЬ ПО на дату документа. Запрос = Новый Запрос( "ВЫБРАТЬ | Ссылка |ИЗ | Документ.ПродажаЕды |УПОРЯДОЧИТЬ ПО | Ссылка ВОЗР |АВТОУПОРЯДОЧИВАНИЕ" ) ; ВыполнитьЗапросИВывестиНаФорму(Запрос) ; КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере