Вконтакте Facebook Twitter Лента RSS

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

«Порядок сортировки, установленный для базы, отличается от системного» в 1С 7.7 на Windows 7 получила распространение с выходом нового семейства операционных систем — Windows 7 , 8 и 10. Рассмотрим инструкцию по решению данной проблемы и причину ошибки.

Первый способ — файл OrdNoChk.prm

Для того чтобы исправить данную ошибку в 1С 7.7, достаточно поместить файл без содержимого с названием «OrdNoChk.prm» в папку BIN с установленной программой.

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

Второй способ — настройки ОС и 1С

Причина этой ошибки достаточно проста и банальна — различаются настройки операционной системы и .

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

Настройка системы должна происходить сразу и в 1С, и в ОС.

Настройка в Windows:

  • Откройте «Пуск – Настройка – Панель управления – Язык и региональные стандарты».
  • На закладке «Региональные параметры» должно быть выбрано – «Русский».
  • В меню «Языки – Подробнее…» – диалоговое окно Языки и службы текстового ввода – вкладка Параметры – Язык ввода по умолчанию должно быть – Русский-Русская.
  • В закладке «Дополнительно» должен быть выбран Русский язык.
/// определенным полям в 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С — это набор некоторых значений. Значения в одном массиве могут быть различных типов.

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

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

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С:Предприятие 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С 8.3 для начинающих программистов: упорядочивание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Случай #1

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

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

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

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

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

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

Случай #2

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

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

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

Случай #3

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

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

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

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

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

Случай #4

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

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

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

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

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

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

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

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

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

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

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

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

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

Начать тест

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

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

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

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

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

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

© 2024 Новогодний портал. Елки. Вязание. Поздравления. Сценарии. Игрушки. Подарки. Шары