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

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

Войдите на сайт как ученик

Войдите как ученик, чтобы получить доступ к материалам школы

Язык запросов 1С 8.3 для начинающих программистов: упорядочивание

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

ВЫБРАТЬ Код, Наименование ИЗ Справочник. Еда

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

С большой долей вероятности у вас получится следующий результат:

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

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

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

Секция УПОРЯДОЧИТЬ ПО

Поля по которым требуется упорядочить запрос перечисляются в секции УПОРЯДОЧИТЬ ПО через запятую:

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

  • ВОЗР - упорядочивание по возрастанию.
  • УБЫВ - упорядочивание по убыванию.

Если не указывать ни одно из этих слов, считается, что сортировка идёт по возрастанию.

Вооружившись знаниями, давайте упорядочим результат нашего запроса по убыванию поля Код :

А теперь упорядочим следующую таблицу

так, чтобы сначала шла сортировка по полю Вкус по возрастанию, а затем (среди строчек с одинаковым значением поля Вкус ) шла сортировка по полю Цвет по убыванию:

ВЫБРАТЬ Вкус, Цвет ИЗ Справочник. Еда УПОРЯДОЧИТЬ ПО Вкус. Наименование ВОЗР, Цвет. Наименование УБЫВ

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

Это связано с тем, что сортировка возможна лишь по полям имеющим один из типов: Строка , Число , Дата .

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

Возможность автоупорядочивания

Ключевое слово АВТОУПОРЯДОЧИВАНИЕ позволяет включить режим автоматического формирования полей для упорядочивания результатов запроса.

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

Итак, поехали.

Прежде всего, ключевое слово АВТОУПОРЯДОЧИВАНИЕ может быть расположено в запросе сразу за или вместо секции УПОРЯДОЧИТЬ ПО:

Автоупорядочивание работает по следующим принципам:

Случай #1

Если в запросе:

  • есть секция УПОРЯДОЧИТЬ ПО

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

Для таблиц документов полем сортировки по умолчанию является дата документа.

Рассмотрим пример:

Так как поле сортировки ЛюбимыйЦвет имеет тип Справочник.Цвета Наименование

Случай #2

Если в запросе:

  • но есть секция ИТОГИ ПО (её мы будем проходить )

В этом случае результат запроса будет упорядочен по полям итогов (в той же последовательности).

Случай #3

Если в запросе:

  • отсутствует секция УПОРЯДОЧИТЬ ПО
  • отсутствует секция ИТОГИ ПО
  • но есть секция СГРУППИРОВАТЬ ПО (группировку мы проходили )

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

Рассмотрим пример:

Так как поле группировки Город имеет тип Справочник.Города , в настройках которого основным представлением выбрано поле Наименование , то этот запрос эквивалентен:

Случай #4

Наконец, если в запросе:

  • отсутствует секция УПОРЯДОЧИТЬ ПО
  • отсутствует секция ИТОГИ ПО
  • отсутствует секция СГРУППИРОВАТЬ ПО

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

Рассмотрим пример:

Почему использование автоупорядочивания нежелательно

Автоупорядочивание подходит:

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

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

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

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

Поэтому всегда старайтесь указывать конкретные поля и конкретный порядок сортировки по ним в секции УПОРЯДОЧИТЬ ПО , такой запрос уже не сломать просто так:

ВЫБРАТЬ Код, Наименование ИЗ Справочник. Еда УПОРЯДОЧИТЬ ПО Наименование ВОЗР

Пройдите тест

Начать тест

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

2. Результаты запроса можно упорядочивать по

3. "УПОРЯДОЧИТЬ ПО ИМЯ_ПОЛЯ" упорядочивает по

4. Чтобы упорядочить по возрастанию в секции УПОРЯДОЧИТЬ ПО необходимо указать имя поля и ключевое слово

5. Чтобы упорядочить по убыванию в секции УПОРЯДОЧИТЬ ПО необходимо указать имя поля и ключевое слово

6. Автоупорядочивание в запросах возможно

Массив в 1С — это набор некоторых значений. Значения в одном массиве могут быть различных типов.

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

Создание массива

1. Как создать массив нужного размера

пМассив = новый Массив(4 ) ; //создали массив из 4 элементов

ПМассив[ 0 ] = "Мы" ;
пМассив[ 1 ] = "создали" ;
пМассив[ 2 ] = "новый" ;
пМассив[ 3 ] = "массив" ;

2. Как создать пустой массив и добавить в него элементы

пМассив = новый Массив; //создали пустой массив

//Внесем значения элементов массива

ПМассив. Добавить("Мы" ) ;


3. Как создать многомерный массив.

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

пМассив = новый Массив (4 , 2 ) ; //создали массив 4х2

//Внесем значения элементов массива, пронумеровав каждое слово

ПМассив[ 0 ] [ 0 ] = "1. " ;
пМассив[ 0 ] [ 1 ] = "Мы" ;
пМассив[ 1 ] [ 0 ] = "2. " ;
пМассив[ 1 ] [ 1 ] = "создали" ;
пМассив[ 2 ] [ 0 ] = "3. " ;
пМассив[ 2 ] [ 1 ] = "многомерный" ;
пМассив[ 3 ] [ 0 ] = "4. " ;
пМассив[ 3 ] [ 1 ] = "массив" ;

4. Как создать фиксированный массив

Фиксированный массив отличается от обычного тем, что его нельзя изменять. Нельзя добавлять, удалять или менять значения элементов такого массива.

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

пМассив = новый Массив;

ПМассив. Добавить("Мы" ) ;
пМассив. Добавить("создали" ) ;
пМассив. Добавить("новый" ) ;
пМассив. Добавить("массив" ) ;

ФМассив = новый ФиксированныйМассив(пМассив) ; // создали фиксированный массив

Функции работы с массивами

Работу функций будем рассматривать на примере одномерного массива пМассив , созданного выше и состоящего из 4 элементов:

  1. «создали»
  2. «новый»
  3. «массив».
Функция ВГраница()

Получает наибольший индекс элемента массива. Он всегда на единицу меньше количества элементов массива.

Индекс = пМассив. ВГраница() // 3;

Функция Вставить()

Вставляет какое-то значение в элемент массива с указанным индексом. Последующие элементы массива сдвигаются

пМассив. Вставить(3 , "новое значение" ) //Теперь массив состоит из 5 элементов

Функция Добавить()

Создает новый элемент в конце массива и вставляет туда заданное значение

пМассив. Добавить("." ) // добавили точку пятым элементов массива;

Функция Количество()

Возвращает количество элементов массива.

пМассив. Количество() ; // 4

Функция Найти()

Ищет в массиве заданный элемент. Если находит, возвращает его индекс. Если не находит, возвращает Неопределено .

Индекс = пМассив. Найти("массив" ) ; // 3
Индекс = пМассив. Найти("строка, которой не было" ) ; // Неопределено

Функция Очистить()

Удаляет все значения из массива.

пМассив. Очистить() ;

Функция Получить()

Получает значение массива по индексу. Эту же задачу можно решить через .

Значение= пМассив. Получить(3 ) // "массив"
Значение= пМассив[ 3 ] ; // "массив"

Функция Удалить()

Удаляет элемент массива по индексу

пМассив. Удалить(3 ) ;

Функция Установить()

Устанавливает значение элемента массива по индексу. Работает аналогично .

пМассив. Установить(3 , "массив!" ) ;
пМассив[ 3 ] = "массив!" ;

Как обойти массив

Можно обойти все элементы массива без указания индекса:

Для каждого ЭлементМассива из пМассив Цикл
Сообщить(ЭлементМассива) ;
КонецЦикла ;

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

Для Индекс= 0 по пМассив. ВГраница() Цикл
Сообщить(пМассив[ Индекс] ) ;
КонецЦикла ;

Как обойти многомерный массив

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

Для каждого Элемент1 из мМассив Цикл
Для каждого Элемент2 из Элемент1 Цикл
Сообщить(Элемент1 ) ;
КонецЦикла ;
КонецЦикла ;

Или с применением индексов.

мМассив= новый массив(3 , 4 ) ;

Для Индекс1 = 0 по мМассив. ВГраница() Цикл
Для Индекс2 по мМассив[ Индекс1 ] . ВГраница() Цикл
Сообщить(мМассив[ Индекс1 ] [ Индекс2 ] ) ;
КонецЦикла ;
КонецЦикла ;

Сортировка массива

Для сортировки массива нам потребуется вспомогательный объект с типом СписокЗначений.

СписокЗнач = новый СписокЗначений; // создаем список значений
СписокЗнач. ЗагрузитьЗначения(пМассив) ; // загружаем в список значения из массива
СписокЗнач. СортироватьПоЗначению(НаправлениеСортировки. Возр) ; //сортируем по возрастанию
СписокЗнач. СортироватьПоЗначению(НаправлениеСортировки. Убыв) ; //или по убыванию
пМассив= СписокЗнач. Выгрузить() ; // выгружаем отсортированные значения обратно в массив

Сравнение двух массивов

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

Функция СравнитьМассивы(Массив1 , Массив2 )

Если Массив1 . Количество() <> Массив2 . Количество() Тогда
Возврат ЛОЖЬ; // Массивы не равны, сравнивать элементы нет смысла.
КонецЕсли ;

Для Индекс= 0 по Массив1 . ВГраница() Цикл
Если Массив1 [ Индекс] <> Массив2 [ Индекс] Тогда
Возврат Ложь ; //эти элементы не равны, значит и массивы не равны
КонецЕсли ;
КонецЦикла ;

Возврат Истина ; // Если дошли до сюда, то массивы равны
КонецФункции

В функцию нужно передать 2 сравниваемых массива. Функция возвращает значение Истина , если массивы равны, и Ложь , если не равны.

Цель удаления ненужного – создание начальных условий для эффективного труда.

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

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

находящиеся на рабочих местах делят на три группы:

– часто используемые объекты (ежедневно по нескольку раз в день);

– редко используемые объекты (раз в неделю или реже);

– неиспользуемые объекты.

Эта классификация объектов сопровождается их пометкой с помощью ярлыков

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

Рисунок С.1 – Пример сортировочных ярлыков.

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

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

Должно быть заранее решено, куда удалять предметы.

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

Если нет потребности в этих предметах течение 30 дней, то удалите их из карантина:

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

2С – Создание порядка

1. Определите свои места для всех предметов, руководствуясь принципами:

– часто применяемые предметы размещайте рядом с местом их использования;

– редко применяемые предметы размещайте на некотором удалении от места их

использования.

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

производительности.

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

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

– где, что и в каком количестве должно находиться;

– где, что и в каком количестве находится.

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

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

– зеленый цвет – зона годной продукции;

– желтый цвет – зона для продукции, подлежащей ремонту или проверке;

– красный цвет – зона для негодной продукции.

Универсальная обработка сортировки табличной части документов (номенклатуры)
Разработка подходит для любых конфигураций на обычных и управляемых формах (УТ10, УТ11, КА, УПП, УНФ, Розница, БП2, БП3 и т.д.).
Работает для любых документов, в которых есть табличная часть Товары.

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

Например, сортировка порядка строк в документах:

  • Артикулам
  • Кодам
  • По группам (иерархии) номенклатуры
  • Категории, производителю.
  • По любому из реквизитов номенклатуры

Сортировка номенклатуры в документах 1С

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

Новое - Сортировка по любым реквизитам номенклатуры

  • Универсальный список готовых сортировок.
  • Возможность выбрать сразу несколько сортировок.
  • Добавление любых реквизитов сортировки.
  • Неограниченный выбор реквизитов через точку.

Примеры использования

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


Автоматическая сортировка

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