БСП в 1С

Значение в массив в 1С через БСП: ЗначениеВМассиве и работа с массивами

Коротко

Чтобы положить значение в массив, вызовите ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Значение) — функция создаёт новый массив и кладёт в него единственный переданный элемент. Это стандартный способ подготовить параметр запроса для оператора В или значение отбора, когда на входе одна ссылка.

Ключевой момент: функция объявлена в модуле ОбщегоНазначенияКлиентСервер, а не в ОбщегоНазначения. Вызов ОбщегоНазначения.ЗначениеВМассиве(...) завершится ошибкой «Метод объекта не обнаружен» — это самая частая ошибка при работе с массивами БСП.

ЗначениеВМассиве: положить значение в массив одной строкой

Задача «одно значение → массив из одного элемента» встречается везде, где API ждёт коллекцию: параметр запроса под оператор В, отбор динамического списка, аргумент типового метода. Вместо трёх строк с Новый Массив и Добавить() в БСП есть готовая функция:

// Вместо:
// Массив = Новый Массив;
// Массив.Добавить(КонтрагентСсылка);

МассивКонтрагентов = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(КонтрагентСсылка);

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Документ.РеализацияТоваровУслуг
    |ГДЕ Контрагент В (&Контрагенты)";
Запрос.УстановитьПараметр("Контрагенты", МассивКонтрагентов);
ЗначениеВМассиве
ЗначениеПроизвольный — любое значение
Массив из Произвольный — массив из одного элемента

Функция ничего не проверяет: Неопределено, пустая ссылка, строка, ещё один массив — всё будет добавлено как единственный элемент. Если на вход придёт массив, вы получите массив из одного массива, а не «плоскую» копию. Для объединения коллекций нужна ДополнитьМассив() (см. ниже).

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

Где лежит функция: ОбщегоНазначенияКлиентСервер, а не ОбщегоНазначения

В БСП есть три близких по названию общих модуля, и путать их — источник ошибок компиляции и «неожиданно серверного» кода:

  • ОбщегоНазначенияКлиентСервер — клиент-серверный модуль без повторного использования. Здесь живут все функции работы с массивами, включая ЗначениеВМассиве, СвернутьМассив, ДополнитьМассив, РазностьМассивов.
  • ОбщегоНазначения — серверный модуль: работа с метаданными, ссылками, запросами к базе. Функций по массивам в нём нет.
  • ОбщегоНазначенияКлиент — только клиентские сценарии (диалоги, работа с формами).

Практический вывод: ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве() вызывается из любого контекста — из модуля формы на клиенте, из модуля объекта, из процедуры &НаСервереБезКонтекста. Дополнительная директива и передача на сервер не нужны: функция работает с памятью и к базе не обращается.

Отдельно проверьте, что вы не вызываете одноимённую функцию из прикладного модуля конфигурации. В типовых встречаются локальные копии ЗначениеВМассиве с другой сигнатурой — код скомпилируется, но поведение будет иным.

В ИИ Консоли кода: вставьте фрагмент, который падает на «Метод объекта не обнаружен», и попросите агента найти правильный модуль БСП. Он проверит вызов прямо на вашей базе и вернёт рабочий вариант — быстрее, чем искать функцию по конфигуратору.

Параметры запросов и отборы: где это нужно каждый день

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

// Отбор динамического списка: значение или список значений
Если ТипЗнч(ЗначениеОтбора) = Тип("Массив") Тогда
    ЗначенияОтбора = ОбщегоНазначенияКлиентСервер.СвернутьМассив(ЗначениеОтбора);
Иначе
    ЗначенияОтбора = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(ЗначениеОтбора);
КонецЕсли;

ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
    Список,
    "Организация",
    ЗначенияОтбора,
    ВидСравненияКомпоновкиДанных.ВСписке);
Типовой приём
ЗначениеВМассивеодиночное значение → коллекция
СвернутьМассивубрать дубли перед отбором
Массив для вида сравнения ВСписке

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

Третий — вызов типовых функций БСП: множество методов принимают Массив из ЛюбаяСсылка и возвращают соответствие «ссылка — данные». Оборачивать одну ссылку вручную незачем.

Свернуть массив в 1С: уникальные значения через БСП

СвернутьМассив() возвращает копию исходного массива, в которой остались только уникальные значения. Исходный массив не меняется:

Номенклатура = Новый Массив;
Номенклатура.Добавить(ТоварА);
Номенклатура.Добавить(ТоварБ);
Номенклатура.Добавить(ТоварА);

Уникальные = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Номенклатура);
// Уникальные = [ТоварА, ТоварБ], Номенклатура не изменилась
СвернутьМассив
МассивМассив из Произвольный — исходные значения
Массив из Произвольный — копия с уникальными значениями

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

Свернуть массив перед подстановкой в параметр запроса полезно не только «для чистоты»: дубли в списке значений оператора В увеличивают объём передаваемых данных, а при последующем обходе результата дают лишние итерации.

ДополнитьМассив: слияние массивов с контролем дублей

Процедура добавляет в МассивПриемник все значения из МассивИсточник. Третий параметр включает режим уникальности — только тогда дубли отсекаются:

ВсеСсылки = Новый Массив;

ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ВсеСсылки, СсылкиИзДокументов);
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ВсеСсылки, СсылкиИзРегистров, Истина);

// Без третьего параметра значения добавляются "как есть", вместе с повторами
ДополнитьМассив
МассивПриемникМассив — изменяется на месте
МассивИсточникМассив — значения для добавления
ТолькоУникальныеЗначенияБулево, по умолчанию Ложь

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

Рядом лежит ДополнитьТаблицуИзМассива(Таблица, Массив, ИмяПоля) — заливает значения массива в указанную колонку таблицы значений построчно. Удобно, когда список ссылок нужно передать в запрос временной таблицей, а не параметром.

Удаление значений из массива: одно вхождение, все вхождения, по типу

В БСП три разные процедуры удаления, и различие между ними принципиально:

// Удалит только ПЕРВОЕ вхождение
ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(Массив, ТоварА);

// Удалит ВСЕ вхождения значения
ОбщегоНазначенияКлиентСервер.УдалитьВсеВхожденияЗначенияИзМассива(Массив, ТоварА);

// Удалит все элементы указанного типа
ОбщегоНазначенияКлиентСервер.УдалитьВсеВхожденияТипаИзМассива(Массив, Тип("Неопределено"));
Процедуры удаления
МассивМассив из Произвольный — изменяется на месте
ЗначениеПроизвольный — удаляемое значение
ТипТип — для варианта удаления по типу

УдалитьЗначениеИзМассива() ищет элемент через Массив.Найти() и удаляет его по индексу. Если значения нет, процедура молча ничего не делает — ошибки не будет. УдалитьВсеВхожденияЗначенияИзМассива() обходит массив от конца к началу, поэтому индексы не «съезжают» и удаляются действительно все совпадения.

УдалитьВсеВхожденияТипаИзМассива() сравнивает ТипЗнч(Элемент) = Тип — это точное совпадение типа, без учёта иерархии. Для составного набора ссылок разных справочников придётся вызвать процедуру на каждый тип отдельно.

РазностьМассивов: вычесть один массив из другого

Функция возвращает новый массив со всеми элементами первого массива, которых нет во втором. Типовой случай — вычислить, какие объекты добавились или выпали при сравнении «было / стало» в обмене данными:

// А = [1, 3, 5, 7]; В = [3, 7, 9]
Результат = ОбщегоНазначенияКлиентСервер.РазностьМассивов(А, В);
// Результат = [1, 5]

Добавленные = ОбщегоНазначенияКлиентСервер.РазностьМассивов(СтавшиеСсылки, БывшиеСсылки);
Удалённые   = ОбщегоНазначенияКлиентСервер.РазностьМассивов(БывшиеСсылки, СтавшиеСсылки);

Внутри — линейный поиск МассивВычитания.Найти(Элемент) для каждого элемента, то есть сложность порядка N * M. На сотнях элементов это незаметно, на десятках тысяч сравнение лучше делать соответствием или запросом на стороне СУБД. Дубли из первого массива в результат попадут все: если нужен чистый список, оберните результат в СвернутьМассив().

Массив в строку и ключи структуры: КлючиСтруктурыВСтроку

Отдельной функции «массив в строку» в БСП нет — для этого достаточно платформенного СтрСоединить(). А вот для структуры готовый метод есть: КлючиСтруктурыВСтроку() собирает имена ключей через разделитель.

// Массив в строку — платформенный метод
ТекстСписка = СтрСоединить(МассивКодов, ", ");

// Ключи структуры в строку — БСП
Параметры = Новый Структура("Организация, Склад, Период");
ИменаПолей = ОбщегоНазначенияКлиентСервер.КлючиСтруктурыВСтроку(Параметры);
// ИменаПолей = "Организация,Склад,Период"

// Обратная операция для строки: разложить в массив слов
Слова = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивСлов("один-@#два2_!три");
КлючиСтруктурыВСтроку
СтруктураСтруктура — источник ключей
РазделительСтрока, по умолчанию «,»
Строка — ключи через разделитель

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

Для подстановки значений массива в шаблон сообщения используйте СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтрокуИзМассива(ШаблонСтроки, Параметры): элементы массива подставляются на места %1, %2 и далее.

В ИИ Консоли кода: опишите задачу словами — «собрать ссылки из двух выборок, убрать дубли и подставить в параметр запроса». Агент напишет код с нужными методами БСП и выполнит его на вашей базе, показав фактическое содержимое массива на каждом шаге.

Частые ошибки при работе с массивами БСП

  • Вызов через ОбщегоНазначения. ОбщегоНазначения.ЗначениеВМассиве() не существует: функции работы с массивами объявлены только в клиент-серверном модуле ОбщегоНазначенияКлиентСервер.
  • Присваивание результата процедуры. ДополнитьМассив(), УдалитьЗначениеИзМассива() и обе процедуры удаления вхождений — это процедуры, они меняют массив на месте и ничего не возвращают. Массив = ДополнитьМассив(...) не скомпилируется.
  • Ожидание уникальности от ДополнитьМассив() по умолчанию. Третий параметр ТолькоУникальныеЗначения равен Ложь, дубли добавятся.
  • Путаница «одно вхождение / все вхождения». УдалитьЗначениеИзМассива() убирает только первое найденное значение. Если в массиве три одинаковых ссылки, останутся две.
  • Передача массива в ЗначениеВМассиве(). Получится массив из одного элемента-массива, и параметр запроса с оператором В отработает вхолостую. Для объединения нужен ДополнитьМассив().
  • Изменение массива, переданного в параметр запроса. После УстановитьПараметр() запрос хранит ссылку на ту же коллекцию: правки до Выполнить() изменят отбор, а после выполнения — уже нет.
  • РазностьМассивов() на больших объёмах. Линейный поиск по второму массиву даёт квадратичную сложность; на десятках тысяч элементов переходите на Соответствие или сравнение запросом.
  • Ожидание сравнения по представлению. Уникальность и поиск идут строго по значению и типу: 1 и "1" — разные элементы, ссылка и её строковое представление тоже.

Частые вопросы про массивы в БСП

В каком модуле БСП находится функция ЗначениеВМассиве?

В общем модуле ОбщегоНазначенияКлиентСервер — клиент-серверном, поэтому вызывать её можно и с клиента, и с сервера. В модуле ОбщегоНазначения её нет, вызов оттуда приведёт к ошибке «Метод объекта не обнаружен».

Чем СвернутьМассив отличается от ДополнитьМассив с признаком уникальности?

СвернутьМассив() — функция: возвращает новую копию с уникальными значениями, исходный массив не трогает. ДополнитьМассив() — процедура: дописывает значения источника в существующий приёмник, а флаг ТолькоУникальныеЗначения лишь исключает добавление повторов.

Как удалить все вхождения значения из массива в 1С через БСП?

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

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 1,5 млн токенов

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты
Начать бесплатно

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Выбрать тариф

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка
Выбрать тариф