Для работы с массивами в БСП 1С есть готовые функции: положить значение в массив, дополнить массив другим, убрать дубли, посчитать разность массивов, удалить значение. Почти все они лежат в общем модуле ОбщегоНазначенияКлиентСервер и работают и на клиенте, и на сервере. Ниже — справочник с реальными сигнатурами, пометкой, возвращает функция новый массив или меняет переданный, и примеры из доработок типовых конфигураций.
Сигнатуры сняты с кода БСП 3.1.5.385 (УТ 11.4.14) и БСП 3.1.10.383 (КА 2.5.20); где версии расходятся, это оговорено. Методы самого массива — Добавить, Найти, Удалить — разобраны в статье «Массив в 1С 8.3», устройство библиотеки — в обзоре БСП для программиста.
ОбработкаПроверкиЗаполнения по условию снимают проверку реквизита, а ПроверяемыеРеквизиты — тоже массив.ЗначениеВМассиве и СвернутьМассив, и надо точно знать, что они делают.Где смотреть: конфигуратор → «Общие» → «Общие модули» → ОбщегоНазначенияКлиентСервер, почти всё — в области «ПрограммныйИнтерфейс» → «Данные». Модуль компилируется на клиенте, на сервере и во внешнем соединении, поэтому директивы для вызова не нужны.
| Функция и параметры | Что делает | Результат |
|---|---|---|
ЗначениеВМассиве(Значение) | Кладёт одно значение в массив | Новый массив из одного элемента |
ДополнитьМассив(МассивПриемник, МассивИсточник, ТолькоУникальныеЗначения = Ложь) | Дописывает элементы источника в конец приёмника. С Истина пропускает значения, которые уже есть в приёмнике или встретились в источнике раньше | Процедура, меняет МассивПриемник |
СвернутьМассив(Знач Массив) | Убирает повторы, порядок первых вхождений сохраняется | Новый массив, исходный не меняется |
РазностьМассивов(Знач Массив, Знач МассивВычитания) | Оставляет элементы первого массива, которых нет во втором | Новый массив |
УдалитьЗначениеИзМассива(Массив, Значение) | Удаляет первое найденное вхождение | Процедура, меняет Массив |
УдалитьВсеВхожденияЗначенияИзМассива(Массив, Значение) | Удаляет все вхождения, обходя массив с конца | Процедура, меняет Массив |
УдалитьВсеВхожденияТипаИзМассива(Массив, Тип) | Удаляет элементы, у которых ТипЗнч равен Тип | Процедура, меняет Массив |
СпискиЗначенийИдентичны(Список1, Список2), в БСП 3.1.10 есть третий параметр СравниватьКоличествоЗначений = Ложь | Сравнивает массивы или списки значений по составу, порядок не важен. Без третьего параметра повторы не считает: [1, 1, 2] и [1, 2] для неё одинаковы | Булево |
ОтмеченныеЭлементы(Список) | Собирает значения отмеченных элементов списка значений | Новый массив |
ДополнитьТаблицуИзМассива(Таблица, Массив, ИмяПоля) | Добавляет строку таблицы значений на каждый элемент массива | Процедура, меняет Таблица |
Перенос массива в таблицу подробно разобран в статье «Массив в таблицу значений», склейка и разбор строк — в статье «Массив в строку».
Модуль ОбщегоНазначения компилируется на сервере, во внешнем соединении и в толстом клиенте обычного приложения. Из управляемой формы его вызывают в процедуре с директивой &НаСервере. Функции из списка — в областях «Данные» и «ДанныеВБазе».
ВыгрузитьКолонку(КоллекцияСтрок, ИмяКолонки, ТолькоУникальныеЗначения = Ложь) — новый массив значений поля из любой коллекции, которую можно обойти Для Каждого: табличной части, таблицы значений, массива структур.КоллекцииИдентичны(КоллекцияСтрок1, КоллекцияСтрок2, ИменаКолонок = "", ИсключаяКолонки = "", УчитыватьПоследовательностьСтрок = Ложь) — сравнивает и массивы. Без учёта порядка проверяет только, что количество элементов совпадает и каждый элемент первого есть во втором: [1, 1, 2] и [1, 2, 2] она признает одинаковыми.ФиксированныеДанные(Данные, ВызыватьИсключение = Истина) — делает из массива ФиксированныйМассив вместе с вложенными коллекциями.СкопироватьРекурсивно(Источник, ФиксироватьДанные = Неопределено) — рекурсивная копия коллекции, с Ложь снимает фиксацию. На клиенте есть такая же ОбщегоНазначенияКлиент.СкопироватьРекурсивно.ТаблицаЗначенийВМассив(ТаблицаЗначений) — массив структур по строкам таблицы.УдалитьНепроверяемыеРеквизитыИзМассива(МассивРеквизитов, МассивНепроверяемыхРеквизитов) — для ОбработкаПроверкиЗаполнения, так её вызывает, например, документ «Заказ клиента» в УТ 11.4.ЗначениеРеквизитаОбъектов(МассивСсылок, ИмяРеквизита, ВыбратьРазрешенные = Ложь, …) — реквизит сразу по массиву ссылок, результат — соответствие «ссылка — значение». Подробнее — в статье о ЗначениеРеквизитаОбъекта.В области «УстаревшиеПроцедурыИФункции» модуля ОбщегоНазначенияКлиентСервер остались СократитьМассив (замена — РазностьМассивов), СкопироватьМассив и СкопироватьРекурсивно этого модуля (замена — СкопироватьРекурсивно из ОбщегоНазначения или ОбщегоНазначенияКлиент). В старом коде они работают, в новых доработках их не используйте.
Процедуру можно вставить в любой модуль конфигурации на БСП и пройти отладчиком: в комментариях — содержимое массивов после каждой строки.
// Шпаргалка по функциям БСП для массивов.
// Директивы не нужны: модуль ОбщегоНазначенияКлиентСервер доступен
// и на клиенте, и на сервере, и во внешнем соединении.
Процедура ШпаргалкаМассивыБСП() Экспорт
// ЗначениеВМассиве: новый массив из одного элемента
Склады = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("Основной"); // [Основной]
Поступившие = Новый Массив;
Поступившие.Добавить("Розница");
Поступившие.Добавить("Транзит");
Поступившие.Добавить("Транзит");
Поступившие.Добавить("Основной");
// ДополнитьМассив: процедура, дописывает элементы в первый параметр
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Склады, Поступившие, Истина);
// Склады = [Основной, Розница, Транзит]: повторы и уже имеющиеся значения пропущены
Все = Новый Массив;
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Все, Поступившие);
// Все = [Розница, Транзит, Транзит, Основной]: без третьего параметра добавлено всё
// СвернутьМассив: новый массив без повторов, исходный не меняется
Уникальные = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Все);
// Уникальные = [Розница, Транзит, Основной], в Все по-прежнему четыре элемента
// РазностьМассивов: новый массив из элементов первого, которых нет во втором
Исключаемые = ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве("Транзит");
БезТранзита = ОбщегоНазначенияКлиентСервер.РазностьМассивов(Все, Исключаемые);
// БезТранзита = [Розница, Основной]
// Процедуры удаления меняют переданный массив
ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(Все, "Транзит");
// Все = [Розница, Транзит, Основной]: удалено только первое вхождение
ОбщегоНазначенияКлиентСервер.УдалитьВсеВхожденияЗначенияИзМассива(Все, "Транзит");
// Все = [Розница, Основной]
Значения = Новый Массив;
Значения.Добавить("Основной");
Значения.Добавить(Неопределено);
Значения.Добавить(150);
ОбщегоНазначенияКлиентСервер.УдалитьВсеВхожденияТипаИзМассива(Значения, Тип("Неопределено"));
// Значения = [Основной, 150]
// СпискиЗначенийИдентичны: одинаковый состав, порядок не важен
Совпадают = ОбщегоНазначенияКлиентСервер.СпискиЗначенийИдентичны(Уникальные, Склады);
// Совпадают = Истина: в обоих массивах Розница, Транзит и Основной
КонецПроцедуры
В параметр передаётся объект заказа клиента или любого документа с табличной частью Товары и колонкой Номенклатура.
// Серверные функции БСП для массивов: общий модуль ОбщегоНазначения.
// Вызывать на сервере: в серверном модуле или в процедуре формы с &НаСервере.
Процедура ШпаргалкаМассивыБСПНаСервере(ЗаказОбъект) Экспорт
// Колонка табличной части без повторов — одним вызовом
Номенклатура = ОбщегоНазначения.ВыгрузитьКолонку(ЗаказОбъект.Товары, "Номенклатура", Истина);
// Так же работает с массивом структур, например прочитанным из JSON
Строки = Новый Массив;
Строки.Добавить(Новый Структура("Артикул, Количество", "А-100", 2));
Строки.Добавить(Новый Структура("Артикул, Количество", "А-200", 1));
Строки.Добавить(Новый Структура("Артикул, Количество", "А-100", 5));
Артикулы = ОбщегоНазначения.ВыгрузитьКолонку(Строки, "Артикул", Истина); // [А-100, А-200]
Обратный = Новый Массив;
Обратный.Добавить("А-200");
Обратный.Добавить("А-100");
// Без учёта порядка — Истина, с учётом порядка (пятый параметр) — Ложь
БезПорядка = ОбщегоНазначения.КоллекцииИдентичны(Артикулы, Обратный);
СПорядком = ОбщегоНазначения.КоллекцииИдентичны(Артикулы, Обратный, , , Истина);
// ФиксированныеДанные: ФиксированныйМассив, методов Добавить и Удалить у него нет
Фиксированный = ОбщегоНазначения.ФиксированныеДанные(Артикулы);
// СкопироватьРекурсивно с Ложь снимает фиксацию, в том числе у вложенных коллекций
Изменяемый = ОбщегоНазначения.СкопироватьРекурсивно(Фиксированный, Ложь);
Изменяемый.Добавить("А-300");
// Таблица значений -> массив структур, например чтобы отдать строки на клиент
Таблица = Новый ТаблицаЗначений;
Таблица.Колонки.Добавить("Артикул");
Таблица.Добавить().Артикул = "А-400";
СтрокиТаблицы = ОбщегоНазначения.ТаблицаЗначенийВМассив(Таблица); // одна структура с ключом Артикул
КонецПроцедуры
Типичная доработка формы списка: команда обрабатывает выделенные заказы, но только проведённые. Код повторяет приём, которым БСП фильтрует ссылки в подключаемых командах.
// Модуль формы списка заказов клиентов, команда добавлена доработкой.
// Ищем строки без цены в выделенных проведённых заказах за один серверный вызов.
&НаКлиенте
Процедура ПроверитьЦены(Команда)
// Копия выделенных строк: свойство таблицы формы не трогаем
Заказы = Новый Массив;
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(Заказы, Элементы.Список.ВыделенныеСтроки);
// При группировке списка среди выделенных бывают строки группировок, а не ссылки
ОбщегоНазначенияКлиентСервер.УдалитьВсеВхожденияТипаИзМассива(Заказы,
Тип("СтрокаГруппировкиДинамическогоСписка"));
Если Заказы.Количество() = 0 Тогда
ПоказатьПредупреждение(, НСтр("ru = 'Выделите заказы в списке.'"));
Возврат;
КонецЕсли;
Результат = ПроверитьЦеныНаСервере(Заказы);
Для Каждого Заказ Из Результат.БезЦены Цикл
ОбщегоНазначенияКлиент.СообщитьПользователю(
СтрШаблон(НСтр("ru = 'В заказе %1 есть строки без цены'"), Заказ), Заказ);
КонецЦикла;
ПоказатьОповещениеПользователя(НСтр("ru = 'Проверка цен'"), ,
СтрШаблон(НСтр("ru = 'Проверено: %1, без цены: %2, пропущено непроведённых: %3'"),
Результат.Проверено, Результат.БезЦены.Количество(), Результат.Непроведенных));
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПроверитьЦеныНаСервере(Знач Заказы)
// Непроведённые отбрасываем: функция БСП возвращает их массивом
Непроведенные = ОбщегоНазначения.ПроверитьПроведенностьДокументов(Заказы);
Проведенные = ОбщегоНазначенияКлиентСервер.РазностьМассивов(Заказы, Непроведенные);
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Товары.Ссылка КАК Ссылка
|ИЗ
| Документ.ЗаказКлиента.Товары КАК Товары
|ГДЕ
| Товары.Ссылка В (&Заказы)
| И Товары.Цена = 0
| И НЕ Товары.Отменено";
Запрос.УстановитьПараметр("Заказы", Проведенные);
Результат = Новый Структура;
Результат.Вставить("Проверено", Проведенные.Количество());
Результат.Вставить("Непроведенных", Непроведенные.Количество());
// Массив ссылок передаётся на клиент без преобразований
Результат.Вставить("БезЦены", Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка"));
Возврат Результат;
КонецФункции
Если перенести серверную функцию в общий модуль с флажком «Вызов сервера», форма документа вызовет ту же проверку для одного заказа: ПроверитьЦеныНаСервере(ОбщегоНазначенияКлиентСервер.ЗначениеВМассиве(Объект.Ссылка)). Запрос удобно сначала отладить в бесплатной консоли запросов.
Частая просьба: при изменении состава заказа уведомлять склад или вести свой журнал. Две разности массивов дают добавленные и удалённые позиции без вложенных циклов.
// Расширение конфигурации, модуль объекта документа ЗаказКлиента (УТ 11.4).
// Перед записью запоминаем добавленные и удалённые позиции,
// после записи пишем их количество в журнал регистрации.
&После("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если Отказ Или ЭтотОбъект.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Состав после редактирования, без повторов
Новые = ОбщегоНазначения.ВыгрузитьКолонку(ЭтотОбъект.Товары, "Номенклатура", Истина);
// Состав, который записан в базе сейчас
Старые = Новый Массив;
Если Не ЭтотОбъект.ЭтоНовый() Тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| Товары.Номенклатура КАК Номенклатура
|ИЗ
| Документ.ЗаказКлиента.Товары КАК Товары
|ГДЕ
| Товары.Ссылка = &Ссылка";
Запрос.УстановитьПараметр("Ссылка", ЭтотОбъект.Ссылка);
Старые = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Номенклатура");
КонецЕсли;
ЭтотОбъект.ДополнительныеСвойства.Вставить("Расш1_Добавленные",
ОбщегоНазначенияКлиентСервер.РазностьМассивов(Новые, Старые));
ЭтотОбъект.ДополнительныеСвойства.Вставить("Расш1_Удаленные",
ОбщегоНазначенияКлиентСервер.РазностьМассивов(Старые, Новые));
КонецПроцедуры
&После("ПриЗаписи")
Процедура Расш1_ПриЗаписи(Отказ)
Если Отказ Или ЭтотОбъект.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Значение по умолчанию — пустой массив, проверять наличие ключа не нужно
Добавленные = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
ЭтотОбъект.ДополнительныеСвойства, "Расш1_Добавленные", Новый Массив);
Удаленные = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(
ЭтотОбъект.ДополнительныеСвойства, "Расш1_Удаленные", Новый Массив);
Если Добавленные.Количество() = 0 И Удаленные.Количество() = 0 Тогда
Возврат;
КонецЕсли;
ЗаписьЖурналаРегистрации("Доработка.ИзменениеСоставаЗаказа",
УровеньЖурналаРегистрации.Информация, ЭтотОбъект.Метаданные(), ЭтотОбъект.Ссылка,
СтрШаблон("Добавлено позиций: %1, удалено: %2",
Добавленные.Количество(), Удаленные.Количество()));
КонецПроцедуры
Реквизит, добавленный расширением, с проверкой заполнения «Выдавать ошибку» нужен не всегда. Снимаем проверку, убирая имя реквизита из массива ПроверяемыеРеквизиты.
// Расширение, модуль объекта документа ЗаказКлиента (УТ 11.4).
// Свой реквизит Расш1_ДатаДоставки с проверкой заполнения «Выдавать ошибку»
// обязателен только после согласования заказа.
&Перед("ОбработкаПроверкиЗаполнения")
Процедура Расш1_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если ЭтотОбъект.Статус = Перечисления.СтатусыЗаказовКлиентов.НеСогласован Тогда
// Имя реквизита в массиве одно — хватает удаления первого вхождения
ОбщегоНазначенияКлиентСервер.УдалитьЗначениеИзМассива(ПроверяемыеРеквизиты, "Расш1_ДатаДоставки");
КонецЕсли;
КонецПроцедуры
В модулях ОбщегоНазначенияКлиентСервер и ОбщегоНазначения БСП 3.1.5 и 3.1.10 нет пересечения массивов и сортировки. А РазностьМассивов для каждого элемента вызывает Найти по второму массиву, что заметно на десятках тысяч элементов. Две функции для своего модуля:
// Свой общий модуль, например Расш1_МассивыКлиентСервер
// (флажки: Клиент (управляемое приложение), Сервер, Внешнее соединение).
// Новый массив из элементов первого массива, которые есть во втором.
Функция ПересечениеМассивов(Массив1, Массив2) Экспорт
ВоВтором = МножествоЗначений(Массив2);
Результат = Новый Массив;
Для Каждого Элемент Из Массив1 Цикл
Если ВоВтором[Элемент] <> Неопределено Тогда
Результат.Добавить(Элемент);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Как ОбщегоНазначенияКлиентСервер.РазностьМассивов, но поиск идёт по соответствию.
Функция РазностьБольшихМассивов(Массив, МассивВычитания) Экспорт
Вычитаемые = МножествоЗначений(МассивВычитания);
Результат = Новый Массив;
Для Каждого Элемент Из Массив Цикл
Если Вычитаемые[Элемент] = Неопределено Тогда
Результат.Добавить(Элемент);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
// Соответствие «значение — Истина»: поиск по ключу не перебирает элементы.
Функция МножествоЗначений(Массив)
Множество = Новый Соответствие;
Для Каждого Элемент Из Массив Цикл
Множество.Вставить(Элемент, Истина);
КонецЦикла;
Возврат Множество;
КонецФункции
Обе функции возвращают новый массив и сохраняют повторы первого массива. Если повторы не нужны, оберните результат в СвернутьМассив.
ДополнитьМассив(Заказы, Элементы.Список.ВыделенныеСтроки) — копия выделенных строк в новый массив. Удаляем элементы уже из копии, свойство таблицы формы остаётся как было.Тип("СтрокаГруппировкиДинамическогоСписка") — если пользователь сгруппировал список, среди выделенных окажутся строки группировок, а не ссылки, и функции, которые ждут ссылки на документы, на них споткнутся. БСП в ПодключаемыеКомандыКлиент тоже берёт из выделенных только ссылки нужного типа.ПроверитьПроведенностьДокументов и РазностьМассивов — функция БСП возвращает массив непроведённых, разность с ним оставляет проведённые. Тем же приёмом ПодключаемыеКомандыКлиент убирает из массива ссылок документы, которые не удалось провести. Отбор, запрос и подсчёт идут за один серверный вызов.ВыгрузитьКолонку(ЭтотОбъект.Товары, "Номенклатура", Истина) — одна строка вместо Товары.ВыгрузитьКолонку и СвернутьМассив.РазностьМассивов(Новые, Старые) даёт добавленные позиции, РазностьМассивов(Старые, Новые) — удалённые. Исходные массивы при этом не меняются.СвойствоСтруктуры(…, Новый Массив) — если ключа нет, вернётся пустой массив, и Количество() не упадёт на Неопределено.&Перед("ОбработкаПроверкиЗаполнения") — в УТ 11.4 типовой обработчик заказа клиента сам проверяет реквизиты из ПроверяемыеРеквизиты функцией ОбщегоНазначенияУТ.ПроверитьЗаполнениеРеквизитовОбъекта и очищает массив, если до этого не было отказа. В &После убирать реквизит уже поздно.МножествоЗначений — соответствие вместо Найти: поиск по ключу не перебирает элементы. На том же приёме БСП построила ДополнитьМассив с ТолькоУникальныеЗначения = Истина.ОбщегоНазначенияКлиентСервер.СвернутьМассив(Массив); выполняется без ошибок, но дубли остаются: функция возвращает новый массив и исходный не трогает. Такой вызов есть даже в типовой УТ 11.4, в функции ОбщегоНазначенияУТ.ИспользуемыеМенеджерыДокументов. Правильно: Массив = ОбщегоНазначенияКлиентСервер.СвернутьМассив(Массив);. То же с РазностьМассивов.ТолькоУникальныеЗначения = Истина старые дубли приёмника остаются.ФиксированныйМассив: такие возвращают ФиксированныеДанные и многие функции модулей с повторным использованием. Сделайте изменяемую копию: ОбщегоНазначения.СкопироватьРекурсивно(Значение, Ложь) на сервере, ОбщегоНазначенияКлиент.СкопироватьРекурсивно на клиенте или Новый Массив(Значение).&НаКлиенте. Перенесите вызов в &НаСервере, про контексты — в статье «Форма на сервере 1С».СпискиЗначенийИдентичны(А, Б, Истина) перенесли из конфигурации на БСП 3.1.10 в конфигурацию на БСП 3.1.5, где у функции два параметра.СвернутьМассив, РазностьМассивов и УдалитьЗначениеИзМассива сравнивают структуры и массивы как объекты, а не по содержимому. Сворачивайте по ключевому полю через ВыгрузитьКолонку, а содержимое сравнивайте функцией ОбщегоНазначения.ДанныеСовпадают.РазностьМассивов перебирает второй массив для каждого элемента первого: для десятков тысяч элементов берите функцию с соответствием выше или запрос.Литерала массива во встроенном языке нет, а ЗначениеВМассиве принимает одно значение. Для строк хватит СтрРазделить("Основной,Розница,Транзит", ","). В КА 2.5 (БСП 3.1.10) есть ОбщегоНазначенияКлиентСервер.МассивЗначений на четыре значения, но она в области «СлужебныйПрограммныйИнтерфейс» и пропускает Неопределено во втором–четвёртом параметрах, а в УТ 11.4 её нет. В доработках надёжнее ЗначениеВМассиве и Добавить.
СвернутьМассив(Массив) возвращает новый массив без повторов и не трогает исходный. ДополнитьМассив(Приемник, Источник, Истина) меняет приёмник, не добавляет в него уже имеющиеся значения, но и старые дубли приёмника не убирает. Сама СвернутьМассив вызывает ДополнитьМассив с пустым приёмником.
Всё из ОбщегоНазначенияКлиентСервер — да. ОбщегоНазначения на тонком и веб-клиенте недоступен, его вызывают в процедуре с &НаСервере или &НаСервереБезКонтекста. Копию на клиенте делает ОбщегоНазначенияКлиент.СкопироватьРекурсивно.
В конфигураторе откройте общий модуль ОбновлениеИнформационнойБазыБСП, процедуру ПриДобавленииПодсистемы: строка Описание.Версия содержит номер, например "3.1.5.385" в УТ 11.4.14. Из кода на сервере версию возвращает СтандартныеПодсистемыСервер.ВерсияБиблиотеки().
Неопределено удаляется по типу: УдалитьВсеВхожденияТипаИзМассива(Массив, Тип("Неопределено")). Пустую ссылку конкретного справочника — по значению: УдалитьВсеВхожденияЗначенияИзМассива(Массив, ПредопределенноеЗначение("Справочник.Склады.ПустаяСсылка")). Если в массиве смешаны типы, пройдите его с конца и удаляйте элементы, для которых ЗначениеЗаполнено возвращает Ложь.
Функции БСП экономят строки, но доработка типовой — это ещё расширение, проверка после обновлений и тесты на копии базы. Если нужна готовая обработка, отчёт или изменение логики документа под ваши правила, посмотрите услугу отчёты и обработки 1С или разместите задачу на площадке: оценка бесплатная, ответ — в течение рабочего дня.
Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.