1с свернуть список значений

Обновлено: 07.07.2024

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

  • СвернутьСтроку(Стр, СтрНачальныйРазделитель, СтрИтоговыйРазделитель) – Убирает повторяющиеся в строке значения. Значения разделены между собой указанным разделителем. Также можно поменять этот разделитель после преобразования.
  • СвернутьМассив(пМассив) – Убирает повторяющиеся в массиве значения.
  • СвернутьТаблицу(Таб, ИсключаяПоля, ПоляСуммы, СуммироватьВсеЧисла) – Убирает повторяющиеся значения в таблице. Процедура аналогична методу ТаблицаЗначений.Свернуть(КолонкиГруппировок, КолонкиСуммирования).

Реализация функций в 1С следующая:

1. Функция «Свернуть строку».

// Сворачивает в строке используемые повторяющиеся значения. // // Параметры: // Стр - <Строка> - Исходная строка; // СтрНачальныйРазделитель - <Строка> - Разделитель для разбора строки, по умолчанию ","; // СтрИтоговыйРазделитель - <Строка> - Разделитель, используемый в собранной строке. // По умолчанию ",". // // Возвращаемое значение: // <Строка> - Собранная строка. // Функция СвернутьСтроку(Стр, СтрНачальныйРазделитель = ",", СтрИтоговыйРазделитель = ", ") Экспорт Результат = ""; МассивСтр = РазобратьСтрокуВМассивПоРазделителю(Стр, СтрНачальныйРазделитель); ЗаполненныйМассив = Новый Массив; Для Каждого Элемент Из МассивСтр Цикл Если ЗаполненныйМассив.Найти(Элемент) = Неопределено Тогда ЗаполненныйМассив.Добавить(Элемент); Результат = Результат + СтрИтоговыйРазделитель + Элемент; КонецЕсли; КонецЦикла; Результат = Сред(Результат, СтрДлина(СтрИтоговыйРазделитель)+1); Возврат Результат; КонецФункции;

2. Функция «Свернуть массив».

// Сворачивает в массиве повторяющиеся значения. // // Параметры: // пМассив - <Массив> - Исходный массив. // // Возвращаемое значение: // <Массив> - Свёрнутый массив. // Функция СвернутьМассив(пМассив) Экспорт Если пМассив.Количество() > 1 Тогда ТЗ = Новый ТаблицаЗначений; ИмяКолонки = "Колонка1"; ТЗ.Колонки.Добавить(ИмяКолонки); Для Индекс = 0 По пМассив.Количество()-1 Цикл ТЗ.Добавить(); КонецЦикла; ТЗ.ЗагрузитьКолонку(пМассив, ИмяКолонки); ТЗ.Свернуть(ИмяКолонки, ""); Возврат ТЗ.ВыгрузитьКолонку(ИмяКолонки); Иначе Результат = Новый Массив; Для Каждого Элемент Из пМассив Цикл Результат.Добавить(Элемент); КонецЦикла; Возврат Результат; КонецЕсли; КонецФункции;

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

// Сворачивает в таблице повторяющиеся значения. // // Параметры: // Таб - <ТаблицаЗначений> - Исходная таблица; // ИсключаяПоля - <Строка> - Колонки таблицы, исключаемые из рассмотрения; // ПоляСуммы - <Строка> - Поля для суммирования строк; // СуммироватьВсеЧисла - <Булево> - Команда на суммирование всех колонок с числами (поля добавляются к полям суммы). // Процедура СвернутьТаблицу(Таб, ИсключаяПоля = "НомерСтроки", ПоляСуммы = "", СуммироватьВсеЧисла = Ложь) Экспорт МассивИсключаяПоля = ?(ИсключаяПоля = "", Новый Массив, ПреобразоватьВМассив(ИсключаяПоля)); Если СуммироватьВсеЧисла Тогда МассивПоляСуммы = Новый Массив; Для Каждого Колонка Из Таб.Колонки Цикл МассивТипов = Колонка.ТипЗначения.Типы(); Если МассивТипов.Найти(Тип("Число")) <> Неопределено И (МассивТипов.Количество() = 1 ИЛИ (МассивТипов.Количество() = 2 И (МассивТипов.Найти(Тип("Null")) <> Неопределено ИЛИ МассивТипов.Найти(Тип("Неопределено")) <> Неопределено)) ИЛИ (МассивТипов.Количество() = 3 И МассивТипов.Найти(Тип("Null")) <> Неопределено И МассивТипов.Найти(Тип("Неопределено")) <> Неопределено)) Тогда ПоляСуммы = ?(ПустаяСтрока(ПоляСуммы), "", ПоляСуммы + ", ") + Колонка.Имя; МассивПоляСуммы.Добавить(Колонка.Имя); КонецЕсли; КонецЦикла; Иначе МассивПоляСуммы = ?(ПоляСуммы = "", Новый Массив, ПреобразоватьВМассив(ПоляСуммы)); КонецЕсли; СтрКолонки = ""; Для Каждого Колонка Из Таб.Колонки Цикл Если МассивПоляСуммы.Найти(Колонка.Имя) = Неопределено И МассивИсключаяПоля.Найти(Колонка.Имя) = Неопределено Тогда СтрКолонки = СтрКолонки + ", " + Колонка.Имя; КонецЕсли; КонецЦикла; СтрКолонки = Сред(СтрКолонки, 3); Таб.Свернуть(СтрКолонки, ПоляСуммы); КонецПроцедуры;

Также в данном коде используются следующие вспомогательные функции:

  • ПреобразоватьВМассив(Объект, Проверка) – Преобразует объект в массив.
  • РазобратьСтрокуВМассивПоРазделителю(Стр, СтрРазделитель, ИгнорироватьПустые) – Разбирает предложенную строку в массив.

Код вспомогательных функций на 1С:

// Преобразует в массив переменную любого типа данных. // // Параметры: // Объект - Произвольный - произвольный объект данных; // Проверка - <Булево> - Осуществление проверки на заполненное значение. // // Возвращаемое значение: // <Массив> - Массив с теми же данными. // Функция ПреобразоватьВМассив(Объект, Проверка = Ложь) Экспорт ОбъектМассив = Новый Массив; Если НЕ Проверка ИЛИ ЗначениеЗаполнено(Объект) Тогда Если ТипЗнч(Объект) = Тип("Массив") Тогда ОбъектМассив = Объект; ИначеЕсли ТипЗнч(Объект) = Тип("СписокЗначений") Тогда ОбъектМассив = Объект.ВыгрузитьЗначения(); ИначеЕсли ТипЗнч(Объект) = Тип("Строка") Тогда ОбъектМассив = РазобратьСтрокуВМассивПоРазделителю(Объект); ИначеЕсли ТипЗнч(Объект) = Тип("Структура") Тогда Для Каждого Элемент Из Объект Цикл ОбъектМассив.Добавить(Элемент.Значение); КонецЦикла; Иначе ОбъектМассив.Добавить(Объект); КонецЕсли; КонецЕсли; Возврат ОбъектМассив; КонецФункции; // Разбирает строку в массив подстрок по разделителю. // При этом пробелы между подстроками не учитываются. // // Параметры: // Стр - исходная строка; // СтрРазделитель - разделитель, по умолчанию ","; // ИгнорироватьПустые - игнорировать ли пустые места между разделителями. // // Возвращаемое значение: // Массив строк // Функция РазобратьСтрокуВМассивПоРазделителю(Знач Стр, СтрРазделитель = ",", ИгнорироватьПустые = Ложь) Экспорт Результат = Новый Массив; ВхождениеРазделителя = Найти(Стр, СтрРазделитель); Пока ВхождениеРазделителя <> 0 Цикл ЧастьДоРазделителя = СокрЛП(Лев(Стр, ВхождениеРазделителя - 1)); Если НЕ (ИгнорироватьПустые И ПустаяСтрока(ЧастьДоРазделителя)) Тогда Результат.Добавить(ЧастьДоРазделителя); КонецЕсли; Стр = СокрЛП(Сред(Стр, ВхождениеРазделителя + 1)); ВхождениеРазделителя = Найти(Стр, СтрРазделитель); КонецЦикла; Если НЕ (ИгнорироватьПустые И ПустаяСтрока(Стр)) Тогда Результат.Добавить(СокрЛП(Стр)); КонецЕсли; Возврат Результат; КонецФункции;

Смело используйте эти и другие функции для реализации своих проектов. Удачи!

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

Объекты типа массив в 1С 8.3 представляют собой совокупность упорядоченных значений любого типа, в том числе и типа «массив», что в свою очередь позволяет организовывать многомерные массивы. Идентификация значений осуществляется по индексам, нумерация которых начинается с «0».

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

Синтаксис:

Примеры:

Добавление элементов в массив

Примеры:


Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>



Получение значения элемента по индексу

Поиск в массиве 1С

Присвоение значений элементам массива

Примеры:

Как узнать количество элементов массива (размер массива)

Перебор массива 1С

Примеры:

Перебор всех элементов двумерного массива

Примеры:

Удаление элементов из массива

Примеры:

Как разложить строку в массив


Пример преобразования массива в список значений


Пример преобразования массива в таблицу значений


Сортировка массива 1С разными способами

Примеры:

Как свернуть массив в 1С

Пример:


Поддержите нас, расскажите друзьям!

СПРОСИТЕ в комментариях!

Услуги 1С

Наш канал на Youtube


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

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

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

Свернуть с использованием метода таблицы значений

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

Пример 1. Пусть у нас существует таблица значений с колонками Номенклатура, Цена, Количество, Сумма. Необходимо в 1с свернуть таблицу значений по колонкам Номенклатура и Цена, просуммировав при этом данные в колонках Количество и Сумма.

1с свернуть таблицу значений

Также стоит отметить следующие особенности метода Свернуть:

  • Работает только НаСервере (как и любые действия с таблицами значений);
  • Прост в реализации;
  • Может суммировать значения, но не может получать минимум, максимум, среднее и т.д.

Свернуть таблицу значений при помощи запроса

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

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

  • Таблицу значений передать параметром в запрос;
  • Сгруппировать по нужным полям,
  • Применить агрегатные функции к нужным полям (сумма, максимум, минимум, среднее);
  • Выгрузить результат запроса в таблицу значений.

Пример 2. Пусть у нас существует таблица значений с колонками Номенклатура, Цена, Количество, Сумма. Необходимо в 1с свернуть таблицу значений по колонке Номенклатура, по колонке Цена получить среднее значение, просуммировать данные в колонках Количество и Сумма.

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

Метод Найти

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

Рассмотрим простой пример. У нас есть таблица значений с колонками: Номенклатура, Количество, Цена, Сумма. Найдем строку, содержащую значение 2 в колонке Количество или в колонке Цена.

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

При изменении значений в найденной строке, изменяются и значения в самой таблице. Это логично, так как мы работаем непосредственно со строкой таблицы значений.

Метод НайтиСтроки

Метод НайтиСтроки предназначен для поиска всех строк таблицы значений, соответствующих указанному отбору. Синтаксис метода:

Пример 2. Пусть у нас есть Таблица значений содержащаяся в переменной Таблица, у которой есть колонки Наименование и Код.

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

Другие способы найти строки таблицы значений

У рассмотренных методов есть свои недостатки. Основной, поиск только на равенство. Если вам необходимо использовать более сложные конструкции отбора строк, то можно обойти таблицу значений циклом, или передать ее в запрос.

Пример 3. Воспользуемся таблицей из самого первого примера. Обработаем строки, цена в которых находится в интервале от 100 до 1000.

Пример 4. Сделаем тоже самое при помощи запроса.

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

Читайте также: