- Изучаем массивы в 1С 8.3 (8.2)
- Перебор элементов массива
- Количество элементов массива
- Добавление элементов массива
- Многомерный массив
- Статьи о других универсальных коллекциях значений в 1С
- Автоматизация бизнеса на платформе 1С:Предприятие 8
- 1. Описание из синтакс-помощника
- 2. Как сформировать новый Массив
- 3. Способы заполнения Массива
- 4. Обход Элементов Коллекции
- Сортировка массивов в 1С
- Внешняя компонента
- Веб-сервис
- Средства платформы
- Массив в 1С: общие сведения и некоторые примеры использования
- Методы массива
- Одномерные и многомерные массивы
- Использование массива
- Работа с массивами в 1С 8
- 1. Как создать массив нужного размера
- 2. Как создать пустой массив и добавить в него элементы
- 3. Как создать многомерный массив
- 4. Как создать фиксированный массив
- Функции работы с массивами
- Функция ВГраница()
- Функция Вставить()
- Функция Добавить()
- Функция Количество()
- Функция Найти()
- Функция Очистить()
- Функция Получить()
- Функция Удалить()
- Функция Установить()
- Как обойти массив
- Как обойти многомерный массив
- Сортировка массива
- Сравнение двух массивов
- Работа с массивом в 1С 8.3 на примерах
- Добавление элементов в массив
- Получение значения элемента по индексу
- Поиск в массиве 1С
- Присвоение значений элементам массива
- Как узнать количество элементов массива (размер массива)
- Перебор массива 1С
- Перебор всех элементов двумерного массива
- Удаление элементов из массива
- Как разложить строку в массив
- Пример преобразования массива в список значений
- Пример преобразования массива в таблицу значений
- Сортировка массива 1С разными способами
- Как свернуть массив в 1С
Изучаем массивы в 1С 8.3 (8.2)
Массив в платформе 1С 8.3 это самая простая универсальная коллекция значений.
Что такое Массив?
Массив в языке программирования 1С — это коллекция элементов, следующих друг за другом, которые могут быть доступны с помощью индекса массива. Элементы могут быть любого типа, в том числе и типа Массив. У каждого элемента в массиве есть уникальный номер, который называют Индексом. Посредством индекса можно получить доступ к данному элементу.
Все элементы в массиве упорядочены, т.е. первый элемент имеет индекс, равный нулю, второй — одному, и так далее.
Создать массив можно при помощи конструктора Новый
Новый Массив (…)
Где:
«КоличествоЭлементов» — необязательный параметр. Он может быть один — тогда мы будем иметь одномерный массив, а также их может быть несколько — тогда мы имеем многомерный массив.
Например,
Массив1 = Новый Массив(10);
— Одномерный массив из 10 элементов.
А:
Массив1 = Новый Массив(3,2);
Двумерный массив из 6 элементов (три строки, два столбца).
Или
Массив1 = Новый Массив();
Массив, не имеющий ни одного элемента, — пустой массив.
В отличие от таблиц значений 1С, работать с массивами можно как в режим тонкого клиента, так и в режим толстого клиента.
Имейте в виду, что когда Вы создадите не пустой массив (одномерный или многомерный), его элементы уже будут существовать, но с не заполненными значениями. Если Вы посмотрите на данный массив в отладчике, то увидите напротив каждого элемента тип Неопределено.
Обращаться к элементу массива можно посредством индекса. Делается это с помощью оператора «квадратные скобки».
Массив1[0] = «Первый»;
Массив1[1] = 2;
Как видите, элементы массива могут иметь разные типы ( в том числе ссылочные).
При помощи индекса и квадратных скобок можно как задать какой-то элемент массива, так и прочитать этот элемент.
Сообщить(«Массив1[0]= » + Массив1[0] +
«, Массив[1] = » + Массив1[1]);
Индекс внутри скобок не должен превышать общего количества элементов минус один (т.к. индекс начинается с нуля). Если мы напишем такой код:
Массив1 = Новый Массив(5);
Массив1[5] = 10;
То при его выполнении, возникнет ошибка «Индекс находится за границами массива»
Хоть мы и указали у конструктора массивов в скобках значение 5, но обращаться может только до 4 индекса, поскольку нумерация индексов начинается с нуля.
Перебор элементов массива
Перебрать все элементы массива можно двумя способами. Первый способ – с помощью так называемого «китайского кода», когда присваиваем каждому элементу массива нужное значение. Иногда это бывает необходимо.
Сообщить(Массив[0]);
Сообщить(Массив[2]);
Сообщить(Массив[1]);
Но чаще необходимо прочитать каждый элемент массива в цикле. Для этого в теле цикла нужно обойти индексы от первого до последнего. Сделать это можно при помощи цикла Для…Цикл.
Массив1 = Новый Массив(3);
Массив1[0] = 10;
Массив1[1] = 3;
Массив1[2] = 7;
Для н = 0 по 2 Цикл
Сообщить(Массив1[н]);КонецЦикла;
Или с помощью цикла Для каждого … Цикл
Для Каждого ЭлМассив из Массив1 Цикл
Сообщить(ЭлМассив);
КонецЦикла;
Где в переменной ЭлМассив для каждой итерации содержится соответствующее значение элемента массива.
Количество элементов массива
Узнать количество элементов массива можно двумя способами. С помощью метода Количество() и метода ВГраница(). Метод Количество() возвращает количество элементов массива (т.е.
то число, что задается в скобках конструктора массива), а метод ВГраница() самый максимальный индекс элемента массива или граница массива.
В этом случае перебор элементов массива в цикле возможен двумя способами.
Для н = 0 по Массив1.Количество() — 1 Цикл
Сообщить(Массив1[н]);
КонецЦикла;
И
Для н = 0 по Массив1.ВГраница() Цикл
Сообщить(Массив1[н]);
КонецЦикла;
Второй способ считается более правильным.
Добавление элементов массива
Добавить элемент массива можно с помощью методов Добавить() и Вставить(). Первый метод добавляет элемент в конец массива, а второй вставляет элемент в нужный индекс массива.
Массив1 = Новый Массив();
Массив1.Добавить(10);
Массив1.Вставить(0,20);
Массив1.Добавить(5);
В этом коде мы создали пустой массив, потом добавили элемент (он же первый), потом вставили на нулевой индекс элемент, а потом добавили. Должен получиться следующий результат.
Многомерный массив
Многомерным массивом в языке программирования 1С называется массив, элементами которого являются массивы. Если одномерный массив создавался посредством конструктора с одним параметром, то в многомерном массиве может быть два и больше параметров.
МассивМн1 = Массив(3,2,5);
В этом примере мы создали массив, у которого будет три элемента, каждый из которых будет массивом, содержащим по два массива, в каждом из которых будет пять элементов.
Например, создадим двумерный массив:
МассивМн1 = Новый Массив(3,2);
Для н = 0 По МассивМн1.ВГраница() цикл
МассивВнутренний = МассивМн1[н];
Для к = 0 по МассивВнутренний.ВГраница() цикл
МассивВнутренний[к] = Строка(н+1)+ «.» + Строка(к+1); КонецЦикла;
КонецЦикла;
А вывод в окно сообщений следующим образом
Для Каждого ЭлМассиваВнеш из МассивМн1 цикл
СтрокаВывода = «»;
Для Каждого ЭлемМассиваВнутр из ЭлМассиваВнеш цикл
СтрокаВывода = СтрокаВывода + » » + ЭлемМассиваВнутр; КонецЦикла;Сообщить(СокрЛ(СтрокаВывода));КонецЦикла;
Статьи о других универсальных коллекциях значений в 1С
Соответствия в 1С
Список значений в 1С
Таблица значений 1С
Структура в 1С
Более подробно о работе с массивами и другими интересными объектами языка программирования в 1С читайте в моей книге «Программировать в 1С за 11 шагов»
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы:
: https://.com/1c_prosto
Фейсбуке: https://www..com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://.com/signum2009
Источник: https://www.1s-up.ru/izuchaem-massivy-v-1c-8-3-8-2/
Автоматизация бизнеса на платформе 1С:Предприятие 8
1. Описание из синтакс-помощника
2. Как сформировать новый Массив
3. Способы заполнения Массива
4. Обход Элементов Коллекции
Массив (тип значения 1С Массив) – это простейшая универсальная коллекция значений в информационной системе 1С, где элементы упорядочены по индексу (нумерация начинается с 0). Тип значения элементов может быть любой, включая тип значения Массив. Доступ к элементам массива осуществляется через индекс, по номеру которого можно получить доступ к значению элемента на платформе 1С 8.3.
1. Описание из синтакс-помощника
Доступность синтакс-помощника: Тонкий клиент 1С, веб-клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).
Возможен обмен с сервером. Сериализуется. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/core}.
Имя типа XDTO: Array.
2. Как сформировать новый Массив
Чтобы сформировать новый Массив, нужно присвоить переменной типа значения «Массив». Каждый Элемент в таком Массиве 1С, получает тип значения «Неопределено». В параметрах создания можно указать, какой Массив хотите создать.
Для пустого Массива:
МойНовыйМассив = Новый Массив();
Для создания одномерного Массива (одна колонка):
МойНовыйМассив = Новый Массив(ЧислоЭлементов);
Для создания N-мерногоМассива, где каждый Элемент так же Массив:
МойНовыйМассив = Новый Массив(ЭлементовПервогоУровня, ЭлементовВторогоУровня, …, ЭлементовN-Уровня);
В этом случае каждый Элемент первого уровня будет иметь тип значения Массив, внутри которого каждый Элемент второго уровня будет так же типом значения Массив и так далее, где на N-уровне Элементы будут с типом значения «Неопределено». Следовательно, количество Элементов в таком Массиве будет равно: ЭлементовПервогоУровня * ЭлементовВторогоУровня* … * ЭлементовN-Уровня
3. Способы заполнения Массива
Существует несколько способов заполнения Массива.
1. Метод «Добавить».
Добавляет Элемент в конец Массива:
МойНовыйМассив.Добавить(«Строка») Поле типа Строка
МойНовыйМассив.Добавить(42) Поле типа Число
МойНовыйМассив.Добавить(‘20190315123501’) Поле типа Дата состав Дата и время
МойНовыйМассив.Добавить(‘20190315’) Поле типа Дата состав Дата
Также любому Элементу может быть присвоен тип значения «Массив». Например:
МойНовыйМассив.Добавить(Новый Массив) Поле типа Массив
2. Метод «Вставить».
Следует отличать его от Метода «Добавить». Последний добавляет Элемент в конец Массива, а первый присваиваетновое значение Элементу:
МойНовыйМассив.Вставить(НомерИндекса,НовоеЗначениеЭлемента)
3. Метод «Количество».
Посредством метода доступно получение количество Элементов в Массиве. Следует обратить внимание, что Количество будет всегда на единицу больше последнего значения Индекса:
МойНовыйМассив.Количество()
4. Метод «Найти». Позволяет найти уникальный Элемент в Массиве, если такой элемент не будет найден, то возвращает значение «Неопределено»:
МойНовыйМассив.Найти(«Слово»)
МойНовыйМассив.Найти(42)
МойНовыйМассив.Найти(’20190315’)
5. Метод «Очистить».
Позволяет удалить все Элементы Массива делая его пустым:
МойНовыйМассив.Очистить()
6. Метод «Получить».
Позволяет получить значение Элемента по его Индексу:
МойНовыйМассив.Получить(ИндексЭлемента)
7. Метод «Удалить».
Позволяет удалить Элемент из Массива по Индексу:
МойНовыйМассив.Удалить(ИндексУдаляемогоЭлемента)
8. Метод «Установить».
Позволяет установить новое значение Элемента по Индексу, когда использование оператора [] (например,МойНовыйМассив[ИндексЭлемента]) невозможно.
МойНовыйМассив.Установить(ИндексЗаменяемогоЭлемента,НовоеЗначениеЭлемента)
9. Метод «ВГраница».
Позволяет получить наибольший Индекс в Массиве. Если Массив пустой, то возвращает-1:
МойНовыйМассив.ВГраница
4. Обход Элементов Коллекции
Для данной Коллекции значений доступен обход Элементов Коллекции посредством оператора «Для каждого». При обходе в Циклах выбираются значения Элементов Массива в порядке возрастания Индекса:
Для каждого ЭлементИз МассивЦикл
КонецЦикла;
Например, при необходимости заменить Элементы на другие значения:
НовоеЧисловоеЗначение = 5;
Для каждого ЭлементИз МойНовыйМассивЦикл
Элемент = НовоеЧисловоеЗначение;
НовоеЧисловоеЗначение = (НовоеЧисловоеЗначение + 7) / 2;
КонецЦикла;
При этом возможен также обход Массива по иному порядку, используя оператор «Для». Следует учитывать, что в таком случае необходимо указывать границу Массива. Иначе по окончанию обхода цикла будет вызвана ошибка «Индекс находится за границами Массива»:
Для Итератор = 0ПоМойНовыйМассив.ВГраница()Цикл
КонецЦикла;
Например, при необходимости выбрать из Массива все значения типа Число и перенести их в новый Массив:
МассивДляЧисел = Новый Массив();
Для Итератор = 0ПоМойНовыйМассив.ВГраница()Цикл
ЗначениеЭлемента = МойНовыйМассив[Итератор];
ЕслиЗначениеЭлемента= Тип («Число») Тогда
МассивДляЧисел.Добавить(ЗначениеЭлемента);
МойНовыйМассив.Удалить(Итератор);
КонецЕсли;
КонецЦикла;
При выполнении обхода многомерных Массивов выполняются те же конструкции, только с учетом мерности Массивов. Так, например, для трехмерного Массива обход его элементов будет выглядеть следующим образом:
Для Итератор1 = 0ПоМассив.ВГраница()Цикл
Сообщить (Массив[Итератор1]);
Для Итератор2 = 0ПоМассив[Итератор1].ВГраница()Цикл
Сообщить (Массив[Итератор1][Итератор2]);
Для Итератор3 = 0ПоМассив[Итератор1][Итератор2].ВГраница()Цикл
Сообщить (Массив[Итератор1] [Итератор2][Итератор3]);
КонецЦикла;
КонецЦикла;
КонецЦикла;
Специалист компании ООО «Кодерлайн»
Иван Каплин.
Источник: https://www.koderline.ru/expert/programming/article-massivy-na-platforme-1s-8-3/
Сортировка массивов в 1С
О различных способах сортировки массивов в 1С наверняка написано уже немало статей. Я решил написать еще одну.
Здесь я не буду расписывать все существующие методы сортировки массивов, которых достаточно много, а просто покажу и сравню два основных, на мой взгляд метода — пузырьковый (тот, который в школах/университетах изучают) и быстрый (самый оптимальный, на мой взгляд).
Итак, вот небольшая функция, которая создает массив заданного размера:
&НаКлиенте Функция ПолучитьМассивЭлементов() мВозврат = Новый Массив(); тГенератор = Новый ГенераторСлучайныхЧисел(Секунда(ТекущаяДата())); Для тСчет = 0 По фЧислоЭлементов-1 Цикл //фЧислоЭлементов – это поле на форме мВозврат.Добавить(тГенератор.СлучайноеЧисло(0, 10000000)); КонецЦикла; Возврат мВозврат; КонецФункции
Функция ПолучитьМассивЭлементов() мВозврат = Новый Массив(); тГенератор = Новый ГенераторСлучайныхЧисел(Секунда(ТекущаяДата())); Для тСчет = 0 По фЧислоЭлементов-1 Цикл //фЧислоЭлементов – это поле на форме мВозврат.Добавить(тГенератор.СлучайноеЧисло(0, 10000000)); |
Отсортируем полученный массив пузырьковым алгоритмом:
&НаКлиенте Процедура СортироватьПузырьком(Команда) тМассив = ПолучитьМассивЭлементов(); тДатаНачала = ТекущаяУниверсальнаяДатаВМиллисекундах(); Для тИндекс1 = 0 По тМассив.ВГраница() Цикл Для тИндекс2 = 0 По тМассив.Вграница() – тИндекс1 – 1 Цикл Если тМассив[тИндекс2] < тМассив[тИндекс2+1] Тогда //Если тМассив[тИндекс2] > тМассив[тИндекс2+1] Тогда – сортировка по возрастанию тБуфер = тМассив[тИндекс2]; тМассив[тИндекс2] = тМассив[тИндекс2+1]; тМассив[тИндекс2+1] = тБуфер; КонецЕсли; КонецЦикла; КонецЦикла; тДатаОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах(); Сообщить(“Время работы (пузырьком): “+(тДатаОкончания-тДатаНачала)+” мс.”); КонецПроцедуры
Процедура СортироватьПузырьком(Команда) тМассив = ПолучитьМассивЭлементов(); тДатаНачала = ТекущаяУниверсальнаяДатаВМиллисекундах(); Для тИндекс1 = 0 По тМассив.ВГраница() Цикл Для тИндекс2 = 0 По тМассив.Вграница() – тИндекс1 – 1 Цикл Если тМассив[тИндекс2] < тМассив[тИндекс2+1] Тогда //Если тМассив[тИндекс2] > тМассив[тИндекс2+1] Тогда – сортировка по возрастанию тБуфер = тМассив[тИндекс2]; тМассив[тИндекс2] = тМассив[тИндекс2+1]; тМассив[тИндекс2+1] = тБуфер; тДатаОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах(); Сообщить(“Время работы (пузырьком): “+(тДатаОкончания-тДатаНачала)+” мс.”); |
Теперь отсортируем быстрым алгоритмом:
&НаКлиенте Процедура БыстраяСортировка(Команда) тМассив = ПолучитьМассивЭлементов(); тДатаНачала = ТекущаяУниверсальнаяДатаВМиллисекундах(); тНачИндекс = 0; тКонИндекс = тМассив.ВГраница(); БыстраяСортировкаРек(тМассив, тНачИндекс, тКонИндекс); тДатаОкончания = ТекущаяУниверсальнаяДатаВМиллисекундах(); Сообщить(“Время работы (быстрая): “+(тДатаОкончания-тДатаНачала)+” мс.”); КонецПроцедуры Процедура БыстраяСортировкаРек(тМассив, тНачИндекс, тКонИндекс) иНачИндекс = тНачИндекс; иКонИндекс = тКонИндекс; иИндекс = тМассив[Цел((иНачИндекс+иКонИндекс)/2)]; Пока иНачИндекс иИндекс Цикл //Пока тМассив[иНачИндекс] < иИндекс Цикл - сортировка по возрастанию иНачИндекс = иНачИндекс+1; КонецЦикла; Пока тМассив[иКонИндекс] < иИндекс Цикл //Пока тМассив[иКонИндекс] > иИндекс Цикл – сортировка по возрастанию иКонИндекс = иКонИндекс-1; КонецЦикла; Если иНачИндекс иИндекс Цикл //Пока тМассив[иНачИндекс] < иИндекс Цикл - сортировка по возрастанию иНачИндекс = иНачИндекс+1; Пока тМассив[иКонИндекс] < иИндекс Цикл //Пока тМассив[иКонИндекс] > иИндекс Цикл – сортировка по возрастанию иКонИндекс = иКонИндекс-1; Если иНачИндекс тБуфер = тМассив[иНачИндекс]; тМассив[иНачИндекс] = тМассив[иКонИндекс]; тМассив[иКонИндекс] = тБуфер; иНачИндекс = иНачИндекс+1; иКонИндекс = иКонИндекс-1; Если тНачИндекс < иКонИндекс Тогда БыстраяСортировкаРек(тМассив, тНачИндекс, иКонИндекс); Если иНачИндекс < тКонИндекс Тогда БыстраяСортировкаРек(тМассив, иНачИндекс, тКонИндекс);
Теперь перейдем к результатам — массив из 1000 элементов:
Сортировка массивов в 1С (1000 элементов)
10000 элементов:
Сортировка массивов в 1С (10000 элементов)
Результаты, я думаю, говорят сами за себя: при увеличении количества элементов массива в 10 раз, время сортировки быстрым алгоритмом также увеличилось приблизительно в 10 раз, в том время как время сортировки пузырьковым алгоритмом увеличилось приблизительно в 100 раз.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Загрузка…
Потребность в склонении фамилий, имен, отчеств, улиц, городов, должностей, званий и всего прочего возникает регулярно. И для решения этой задачи существуют проверенные и зарекомендовавшие себя способы. С выходом платформы 8.3.
13 к этим способам добавился еще один — склонение средствами платформы, и именно этот способ видится наиболее правильным и удобным. Этот и прочие, достойные упоминания (по моему субъективному мнению), способы будут рассмотрены ниже.
Внешняя компонента
Начнем с самого, вероятно, популярно на сегодняшний день способа — внешняя компонента «Склонение ФИО». Эта компонента существует в двух вариантах: по технологии COM и по технологии Native API. Вариант выполненный по технологии Native API современнее и предпочтительнее.
При скачивании с сайта ИТС мы получаем архив который содержит файл «NAMEDECL.DLL» и файл «NameDecl.zip». Первый файл — это компонента по технологии COM, а второй файл — это архив содержащий компоненту по технологии Native API (он так и используется в архиве).
Компоненту выполненную по технологии COM сначала нужно зарегистрировать, командой «regsvr32» от имени администратора:
Регистрация внешней компоненты
Пример использования:
&НаКлиенте Процедура КомпонентаCOM(Команда) Компонента = “C:ameDecl.dll”; Попытка ЗагрузитьВнешнююКомпоненту(Компонента); Объект = Новый(“AddIn.NameDeclension”); Исключение Сообщить(“Не удалось загрузить внешнюю компоненту по причине: ” + ОписаниеОшибки()); КонецПопытки; Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 2, 1)); //родительный, пол мужской Сообщить(Объект.Просклонять(“Иванова Анна Ивановна”, 3, 2)); //дательный, пол женский Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 4)); //винительный, пол авто Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 5)); //творительный, пол авто Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 6)); //предложный, пол авто КонецПроцедуры
Процедура КомпонентаCOM(Команда) Компонента = “C:ameDecl.dll”; ЗагрузитьВнешнююКомпоненту(Компонента); Объект = Новый(“AddIn.NameDeclension”); Сообщить(“Не удалось загрузить внешнюю компоненту по причине: ” + ОписаниеОшибки()); Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 2, 1)); //родительный, пол мужской Сообщить(Объект.Просклонять(“Иванова Анна Ивановна”, 3, 2)); //дательный, пол женский Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 4)); //винительный, пол авто Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 5)); //творительный, пол авто Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 6)); //предложный, пол авто |
Компоненту выполненную по технологии Native API регистрировать не нужно, ее необходимо поместить в общий макет (тип макета — «Внешняя компонента») и использовать примерно таким кодом:
&НаКлиенте Процедура КомпонентаNative(Команда) УстановитьВнешнююКомпоненту(“ОбщийМакет.КомпонентаСклонений”); Попытка ПодключитьВнешнююКомпоненту(“ОбщийМакет.КомпонентаСклонений”, “NameDecl” , ТипВнешнейКомпоненты.Native); Объект = Новый(“AddIn.NameDecl.CNameDecl”); Исключение Сообщить(“Не удалось подключить внешнюю компоненту по причине: ” + ОписаниеОшибки()); КонецПопытки; Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 2, 1)); //родительный, пол мужской Сообщить(Объект.Просклонять(“Иванова Анна Ивановна”, 3, 2)); //дательный, пол женский Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 4)); //винительный, пол авто Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 5)); //творительный, пол авто Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 6)); //предложный, пол авто КонецПроцедуры
Процедура КомпонентаNative(Команда) УстановитьВнешнююКомпоненту(“ОбщийМакет.КомпонентаСклонений”); ПодключитьВнешнююКомпоненту(“ОбщийМакет.КомпонентаСклонений”, “NameDecl” , ТипВнешнейКомпоненты.Native); Объект = Новый(“AddIn.NameDecl.CNameDecl”); Сообщить(“Не удалось подключить внешнюю компоненту по причине: ” + ОписаниеОшибки()); Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 2, 1)); //родительный, пол мужской Сообщить(Объект.Просклонять(“Иванова Анна Ивановна”, 3, 2)); //дательный, пол женский Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 4)); //винительный, пол авто Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 5)); //творительный, пол авто Сообщить(Объект.Просклонять(“Иванов Иван Иванович”, 6)); //предложный, пол авто |
Как уже говорилось выше, компонента выполненная по технологии Native API предпочтительнее, так как работает и в ОС Linux, в тоже время ее можно использовать и на клиенте и на сервере.
Веб-сервис
Еще одним способом просклонять что-либо является использование веб-сервиса «Морфер». Сервис бесплатный, хотя имеет и платный вариант, кроме этого функционал «Морфера» доступен в виде платной внешней компоненты.
Основным недостатком данного метода является его негарантированная работоспособность — нет интернета или сервис не доступен.
Использование веб-сервиса выглядит так:
&НаКлиенте Процедура СервисСклонения(Команда) СклоняемыйТекст = “Пушкин Александр Сергеевич”; АдресСервера = “ws3.morpher.ru”; Соединение = Новый HTTPСоединение(АдресСервера,,,,,, Новый ЗащищенноеСоединениеOpenSSL()); ТекстЗапроса = “/russian/declension?s=” + СклоняемыйТекст; Заголовки = Новый Соответствие; Заголовки.Вставить(“User-Agent”, “1C Enterprise 8.3”); Заголовки.Вставить(“Accept”, “application/json”); Заголовки.Вставить(“charset”, “UTF-8”); Запрос = Новый HTTPЗапрос(ТекстЗапроса, Заголовки); Ответ = Соединение.Получить(Запрос); Если Ответ.КодСостояния = 200 Тогда ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку()); СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON); ЧтениеJSON.Закрыть(); Сообщить(СтруктураОтвета.Р); Сообщить(СтруктураОтвета.Д); Сообщить(СтруктураОтвета.В); Сообщить(СтруктураОтвета.Т); Сообщить(СтруктураОтвета.П); КонецЕсли; КонецПроцедуры
Процедура СервисСклонения(Команда) СклоняемыйТекст = “Пушкин Александр Сергеевич”; АдресСервера = “ws3.morpher.ru”; Соединение = Новый HTTPСоединение(АдресСервера,,,,,, Новый ЗащищенноеСоединениеOpenSSL()); ТекстЗапроса = “/russian/declension?s=” + СклоняемыйТекст; Заголовки = Новый Соответствие; Заголовки.Вставить(“User-Agent”, “1C Enterprise 8.3”); Заголовки.Вставить(“Accept”, “application/json”); Заголовки.Вставить(“charset”, “UTF-8”); Запрос = Новый HTTPЗапрос(ТекстЗапроса, Заголовки); Ответ = Соединение.Получить(Запрос); Если Ответ.КодСостояния = 200 Тогда ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(Ответ.ПолучитьТелоКакСтроку()); СтруктураОтвета = ПрочитатьJSON(ЧтениеJSON); Сообщить(СтруктураОтвета.Р); Сообщить(СтруктураОтвета.Д); Сообщить(СтруктураОтвета.В); Сообщить(СтруктураОтвета.Т); Сообщить(СтруктураОтвета.П); |
Отмечу, что приведен минимально необходимый код, для реального применения будет разумно добавить какие-то проверки и обработки возможных ошибок.
Средства платформы
Источник: https://1c-programmer-blog.ru/programmirovanie/sortirovka-massivov-v-1s.html
Массив в 1С: общие сведения и некоторые примеры использования
Понятие «массив» уже давно используется в программировании и, чаще всего, под ним понимают некоторую структуру в памяти, состоящую из последовательности элементов. Массив в 1С – самая простая из универсальных коллекций значений. Помимо массива к универсальным коллекциям относятся:
- Список значений (в отличие от массива у значений из списка есть представление, реализована возможность сортировки и интерфейсного представления коллекции);
- Таблица значений – коллекция, имеющая колонки для расширенного описания значения, подобную структуру можно получить, выполнив запрос;
- Дерево – очень похоже на таблицу, дополненную структурой подчиненности;
- Структура – динамический набор имен и значений переменных;
- Соответствие – подобно структуре, только переменные сопоставляются не строковым представлениям, а друг другу.
Методы массива
Программное создание экземпляра массива происходит с помощью с помощью оператора Новый() (Рис.1).
Рис.1
Как видно из приведенного примера массивы можно создавать как с фиксированным количеством элементов, так и без этого ограничения.
Прежде, чем приступать к обсуждению методов работы с массивом, давайте определимся с двумя понятиями:
- Индекс элемента – можно представить как порядковый номер отдельно взятого значения;
- Количество элементов – число элементов в коллекции, его определение доступно с помощью метода Количество().
Важно знать: в 1С подсчет количества значений любой коллекции начинается с 1, а раздача индексов с 0, т.е первый элемент в массиве имеет индекс 0. Таким образом, обход коллекции с помощью цикла с итератором должен начинаться с 0 и заканчиваться количеством элементов минус 1, в противном случае система с помощью окна (Рис.2) уведомит о наступлении исключительной ситуации.
Рис.2
Любой объект конфигурации имеет свои методы для работы, массив не исключение, перечислим их с некоторой расшифровкой:
- ВГраница() – с помощью метода можно получить максимальный индекс элемента, для пустого массива будет возвращено значение (-1);
- Вставить() – этот метод имеет два параметра: индекс и значение, индекс указывает куда в массив вставить новый элемент, добавляемое значение может быть пустым;
- Добавить() – этот метод вставки значения можно использовать, когда место размещения элемента непринципиально, с его помощью новые данные будут записаны в конец имеющегося массива;
- Найти() – в случае успешного выполнения возвращает индекс указанного в скобках значения, в противном случае возвращает «Неопределено»;
- Очистить() –очищает коллекцию;
- Получить() – читает данные, расположенные в массиве по указанному индексу, можно заменить квадратными скобками [];
- Удалить() – удаляет элемент с указанным индексом;
- Установить() – заменяет данные в указанной ячейке массива.
Одномерные и многомерные массивы
В простейшем случае одномерный массив может содержать значения различных типов (Рис.3)
Рис.3.
Результат выполнения вышеприведенного кода представлен на Рис.4
Рис.4
Таким образом, мы получили одномерный массив, состоящий из строкового значения, ссылки на элемент справочника и даты. При этом при добавлении элементов мы использовали два различных метода Добавить() и Вставить(), если бы при добавлении даты мы использовали метод Добавить() наш результат имел бы несколько другой вид.
В старших классах средней школы дается представление о понятии двумерной матрицы. Это такой набор данных, каждый элемент которого имеет два индекса (в простейшем случае порядковый номер по вертикали и по горизонтали) именно она лучше всего иллюстрирует понятие двумерного массива.
Создавая подобную матрицу можно указать количество строк и столбцов, которые будут использованы.
Допустим, перед нами стоит задача создать массив из фамилии, имени и отчества двух сотрудников. С помощью кода (Рис.5) создаем соответствующий массив с фиксированным количеством столбцов и строк.
Рис.5
Для его обхода нам понадобится два цикла, в первом цикле мы обходим массив по строкам, во втором разбираем строку на элементы. Это можно сделать либо с помощью цикла «Для каждого …. Из» (Рис.6)
Рис.6
Либо с помощью цикла с итератором «Для … по» (Рис.7)
Рис.7
В принципе, количество измерений конкретного массива может быть любым, другое дело, что в случае большого количества уровней детализации достаточно сложно создать построитель для чтения данных.
Использование массива
Массивы в 1С чаще всего используются для:
- Создания различных отборов используемых при работе с запросами и другими коллекциями значений;
- Передачи списков в качестве параметров между процедурами и функциями;
- Обмена данными с внешними компонентами, подключенными с использованием COM технологии.
Безусловно, это далеко неполный список того, в каких целях можно задействовать объект «Массив».
Источник: http://blog.it-terminal.ru/programmirovanie-1s/massiv-1s.html
Работа с массивами в 1С 8
Массив в 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 элементов:
- «Мы»
- «создали»
- «новый»
- «массив».
Функция ВГраница()
Получает наибольший индекс элемента массива. Он всегда на единицу меньше количества элементов массива.
Индекс = пМассив.ВГраница() // 3;
Функция Вставить()
Вставляет какое-то значение в элемент массива с указанным индексом. Последующие элементы массива сдвигаются
пМассив.Вставить(3, “новое значение”) //Теперь массив состоит из 5 элементов
Функция Добавить()
Создает новый элемент в конце массива и вставляет туда заданное значение
пМассив.Добавить(“.”) // добавили точку пятым элементов массива;
Функция Количество()
Возвращает количество элементов массива.
пМассив.Количество(); // 4
Функция Найти()
Ищет в массиве заданный элемент. Если находит, возвращает его индекс. Если не находит, возвращает Неопределено.
Индекс = пМассив.Найти(“массив”); // 3
Индекс = пМассив.Найти(“строка, которой не было”); // Неопределено
Функция Очистить()
Удаляет все значения из массива.
Функция Получить()
Получает значение массива по индексу. Эту же задачу можно решить через [].
Значение=пМассив.Получить(3) // “массив”
Значение=пМассив[3]; // “массив”
Функция Удалить()
Удаляет элемент массива по индексу
Функция Установить()
Устанавливает значение элемента массива по индексу. Работает аналогично [].
пМассив.Установить(3, “массив!”);
пМассив[3]=”массив!”;
Как обойти массив
Можно обойти все элементы массива без указания индекса:
Для каждого ЭлементМассива из пМассив Цикл
Сообщить(ЭлементМассива);
КонецЦикла;
Можно при обходе использовать индекс:
Для Индекс=0 по пМассив.ВГраница() Цикл
Сообщить(пМассив[Индекс]);
КонецЦикла;
Как обойти многомерный массив
Многомерный массив обходится с помощью тех же циклов (см. выше), но один цикл должен быть вложен в другой.
мМассив=новый массив(3,4);
Для каждого Элемент1 из мМассив Цикл
Для каждого Элемент2 из Элемент1 Цикл
Сообщить(Элемент1);
КонецЦикла;
КонецЦикла;
Или с применением индексов.
мМассив=новый массив(3,4);
Для Индекс1=0 по мМассив.ВГраница() Цикл
Для Индекс2 по мМассив[Индекс1].ВГраница() Цикл
Сообщить(мМассив[Индекс1][Индекс2]);
КонецЦикла;
КонецЦикла;
Сортировка массива
Для сортировки массива нам потребуется вспомогательный объект с типом СписокЗначений.
СписокЗнач = новый СписокЗначений; // создаем список значений
СписокЗнач.ЗагрузитьЗначения(пМассив); // загружаем в список значения из массива
СписокЗнач.СортироватьПоЗначению(НаправлениеСортировки.
Возр); //сортируем по возрастанию
СписокЗнач.СортироватьПоЗначению(НаправлениеСортировки.Убыв); //или по убыванию
пМассив=СписокЗнач.
Выгрузить(); // выгружаем отсортированные значения обратно в массив
Сравнение двух массивов
Перед тем, как перейти к описанию функции сравнения, договоримся, что массивы считаются идентичными, если имеют одинаковое количество элементов и соответствующие элементы массивов равны. Тогда для сравнения можно использовать следующую функцию (кстати, такая функция уже присутствует в некоторых типовых конфигурациях):
Функция СравнитьМассивы(Массив1, Массив2)
Если Массив1.Количество()Массив2.Количество() Тогда
Возврат ЛОЖЬ; // Массивы не равны, сравнивать элементы нет смысла.
КонецЕсли;
Для Индекс=0 по Массив1.ВГраница() Цикл
Если Массив1[Индекс]Массив2[Индекс] Тогда
Возврат Ложь; //эти элементы не равны, значит и массивы не равны
КонецЕсли;
КонецЦикла;
Возврат Истина; // Если дошли до сюда, то массивы равны
КонецФункции
В функцию нужно передать 2 сравниваемых массива. Функция возвращает значение Истина, если массивы равны, и Ложь, если не равны.
Источник: http://chel1C.ru/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8-%D0%B2-1%D1%81-8/
Работа с массивом в 1С 8.3 на примерах
Объекты типа массив в 1С 8.3 представляют собой совокупность упорядоченных значений любого типа, в том числе и типа «массив», что в свою очередь позволяет организовывать многомерные массивы. Идентификация значений осуществляется по индексам, нумерация которых начинается с «0».
Добавление элементов в массив
Примеры:
Массив = Новый Массив();//Создадим массив для примера //Метод Добавить().Добавляет элемент в конец массива Массив.Добавить(“знач1”);//Добавили элемент с типом строка Массив.Добавить();//Добавили пустой элемент в массив
Результат:
//Метод Вставить().Вставляет значение в массив по индексу. Массив.Вставить(0);//Вставили пустой элемент в начало массива. Тем самым //произошла переиндексация всего массива. Элемент с индексом //[0] стал [1], [1] стал [2]
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания – попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Результат:
Массив.Вставить(5,”знач6″);//Вставили элемент со значением “знач6” по индексу [5]. //По недостающим индексам [3] и [4], произошло добавление //пустых элементов
Результат:
Получение значения элемента по индексу
Массив.Получить(5);//В скобках указываем индекс (число) желаемого элемента ДвумерныйМассив.Получить(0).Получить(0);
Поиск в массиве 1С
Массив.Найти(“знач6”);//В скобках указываем значение искомого элемента
Присвоение значений элементам массива
Примеры:
Массив.Установить(0,10);//Присвоили ранее созданному элементу с // индексом [0] значение “10”, тип число Массив[2] = “знач3”;//Присвоили ранее созданному элементу с индексом [2] //значение “знач3”, тип строка ДвумерныйМассив[0][0] = “ЗНАЧ”;//Присвоили ранее созданному элементу //с индексом [0][0] значение “ЗНАЧ”, тип строка
Как узнать количество элементов массива (размер массива)
Массив.ВГраница();//Получаем наибольший индекс элемента массива (число) Массив.Количество();//Получаем количество элементов в массиве (число)
Перебор массива 1С
Примеры:
//По индексу Для Индекс = 0 по Массив.ВГраница() Цикл Сообщить(Индекс); КонецЦикла; //По элементам Для Каждого Элемент Из Массив Цикл Сообщить(Элемент); КонецЦикла;
Перебор всех элементов двумерного массива
Примеры:
//По индексу Для ИндексСтр = 0 По ДвумерныйМассив.ВГраница() Цикл Для ИндексСтолбец = 0 По ДвумерныйМассив[ИндексСтр].ВГраница() Цикл Сообщить(ДвумерныйМассив[ИндексСтр][ИндексСтолбец]); КонецЦикла; КонецЦикла; //По элементам Для Каждого Строка Из ДвумерныйМассив Цикл Для Каждого Элемент Из Строка Цикл Сообщить(Элемент); КонецЦикла; КонецЦикла;
Удаление элементов из массива
Примеры:
//Удаление элемента из массива по индексу Массив.Удалить(3);//В скобках указываем индекс (число) удаляемого элемента //Удаление всех элементов из массива Массив.Очистить();
Как разложить строку в массив
&НаКлиенте Процедура СтрокуВ_Массив(Команда) МассивСтрок = Новый Массив; Строка = “Строку в массив”; МассивСтрок = СтрРазделить(Строка, ” “); КонецПроцедуры
Результат:
Пример преобразования массива в список значений
&НаКлиенте Процедура МассивВ_СписокЗначений(Команда) Массив = Новый Массив(); Массив.Добавить(“знач1”); Массив.Добавить(“знач2”); Массив.Добавить(“знач3”); СЗ = Новый СписокЗначений;//Создаём список значений СЗ.ЗагрузитьЗначения(Массив);//Загрузка значений элементов массива в СЗ КонецПроцедуры
Результат:
Пример преобразования массива в таблицу значений
&НаКлиенте Процедура МассивВ_ТЗ(Команда) Массив = Новый Массив(); Массив.Добавить(1); Массив.Добавить(2); Массив.
Добавить(3); МассивВ_ТЗ_Сервер (Массив); КонецПроцедуры &НаСервере Процедура МассивВ_ТЗ_Сервер (Массив) ТЗ = Новый ТаблицаЗначений;//Создаём таблицу значений ТЗ.Колонки.Добавить(“НаборЧисел”); //Добавляем строки в ТЗ Для Индекс = 0 по Массив.ВГраница() Цикл НовСтрока = ТЗ.
Добавить(); КонецЦикла; ТЗ.ЗагрузитьКолонку(Массив,”НаборЧисел”);//преобразуем в таблицу значений ТЗизМассива = ТЗ;//результат КонецПроцедуры
Результат:
Сортировка массива 1С разными способами
Примеры:
//Через список значений &НаКлиенте Процедура СортироватьМассивЧерезСЗ(Команда) Массив = Новый Массив(); Массив.Добавить(“знач1”); Массив.Добавить(“знач2”); Массив.Добавить(“знач3”); СЗ = Новый СписокЗначений;//Создаём список значений СЗ.ЗагрузитьЗначения(Массив);//Загрузка значений элементов массива в СЗ СЗ.СортироватьПоЗначению(НаправлениеСортировки.Убыв);//Сортируем по убыванию СЗ.СортироватьПоЗначению(НаправлениеСортировки.Возр);//Сортируем по возрастанию Массив = СЗ.ВыгрузитьЗначения();//В массив КонецПроцедуры //Через таблицу значений &НаКлиенте Процедура СортироватьМассивЧерезТЗ(Команда) Массив = Новый Массив(); Массив.Добавить(1); Массив.Добавить(2); Массив.Добавить(3); ОтсортированныйМассив = СортироватьМассивЧерезТЗ_Сервер(Массив); КонецПроцедуры &НаСервере Функция СортироватьМассивЧерезТЗ_Сервер(Массив) ТЗ = Новый ТаблицаЗначений; ТЗ.Колонки.Добавить(“НаборЧисел”); //Добавляем строки в ТЗ Для Индекс = 0 по Массив.ВГраница() Цикл НовСтрока = ТЗ.Добавить(); КонецЦикла; ТЗ.ЗагрузитьКолонку(Массив,”НаборЧисел”);//Преобразуем в таблицу значений ТЗ.Сортировать(“НаборЧисел Убыв”);//Сортируем по убыванию ТЗ.Сортировать(“НаборЧисел Возр”);//Сортируем по возрастанию Массив = ТЗ.ВыгрузитьКолонку(“НаборЧисел”);//В массив Возврат Массив; КонецФункции
Как свернуть массив в 1С
Пример:
&НаКлиенте Процедура Массив(Команда) Массив = Новый Массив(); Массив.Добавить(“Яблоко”); Массив.Добавить(“Яблоко”); Массив.Добавить(“Банан”); Соответствие = Новый Соответствие; Для каждого Элемент Из Массив Цикл Соответствие.Вставить(Элемент); КонецЦикла; Массив.Очистить(); Для каждого КлючИЗначение Из Соответствие Цикл Массив.Добавить(КлючИЗначение.Ключ); КонецЦикла; КонецПроцедуры
Результат:
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Источник: https://programmist1s.ru/massivy-v-1s/