Поиск нужной позиции в документе 1С 8.3, где сотни строк
Содержание
Чтобы найти строку в табличной части 1С 8.3, встаньте в нужную колонку таблицы и нажмите Ctrl+F: откроется окно поиска, где задаётся значение и способ сравнения. Отменить результат поиска — Ctrl+Q. Если строк сотни, а искать нужно по нескольким условиям сразу, выручают сортировка, вывод списка в табличный документ и, для разработчика, методы НайтиСтроки() и ОтборСтрок.
Поиск в табличной части — механизм платформы, а не конкретной конфигурации. Поэтому всё ниже одинаково работает в Бухгалтерии 3.0, ЗУП 3.1, УТ 11 и других решениях на управляемых формах с интерфейсом «Такси». Отличаются только имена табличных частей: «Товары», «Услуги», «Начисления» и т. д.
Поиск строки в табличной части через Ctrl+F
Это самый быстрый способ, и о нём часто забывают из-за одной детали: поиск идёт по той колонке, где сейчас стоит курсор. Встали в колонку «Количество», а ищете номенклатуру — ничего не найдётся.
Порядок действий:
- Откройте документ и щёлкните по любой ячейке нужной колонки, например «Номенклатура».
- Нажмите
Ctrl+Fили выберите в менюЕщёнад таблицей команду поиска. - В окне поиска проверьте поле «Где искать» — там должна быть нужная колонка. Если нет, выберите её из списка.
- Введите фрагмент текста в поле «Что искать».
- Выберите способ сравнения: по части строки, по началу строки или по точному совпадению.
- Нажмите «Найти».
В зависимости от версии платформы результат выглядит по-разному. В одних релизах курсор просто переходит к первой подходящей строке. В других таблица временно показывает только найденные строки, а над ней появляется признак активного поиска. В обоих случаях Ctrl+Q возвращает полный список.
Ограничения обычного поиска
- 🔍 Ищется представление значения — то, что видно на экране. Для ссылки это наименование элемента, а не код и не артикул.
- 📏 Одно условие за раз. «Номенклатура содержит «болт» и количество больше 10» стандартным окном не задать.
- 🔢 Числа сравниваются как текст. Поиск «1 500» по колонке «Сумма» может не найти строку, где отображается «1 500,00», если выбрано точное совпадение.
- 🙈 Скрытые колонки в поиск не попадают. Если артикул не выведен в таблицу, по нему окно не найдёт.
Ищете по артикулу или коду, а колонки нет? Выведите её через Ещё → Изменить форму, отметьте нужное поле галочкой, и оно появится в таблице. После этого поиск по нему заработает.
Сортировка и отбор строк табличной части вручную
Отдельного пользовательского «отбора» у табличной части документа, как у журнала или справочника, нет. Но есть два приёма, которые в работе заменяют фильтр.
Сортировка по колонке
В меню Ещё таблицы есть команды сортировки по возрастанию и по убыванию. Они упорядочивают строки по текущей колонке. После сортировки по номенклатуре все строки с одним товаром стоят рядом — это быстрый способ найти дубли позиций.
Сортировка меняет порядок строк в самом документе: после записи сохранятся новые номера строк. Если порядок важен для печатной формы или его согласовывали с контрагентом, не записывайте документ после сортировки — закройте без сохранения.
Вывод списка в табличный документ
Команда Ещё → Вывести список... выгружает содержимое таблицы в отдельное окно. В настройках вывода можно оставить только нужные колонки. Дальше с этим окном работают как с обычной таблицей:
- Нажмите
Ctrl+F— поиск здесь ищет по всем ячейкам, а не по одной колонке. - Сохраните результат в Excel через меню сохранения, если нужен автофильтр по нескольким колонкам.
- Найдите номер строки (колонка «N») и вернитесь в документ.
Этот способ особенно удобен, когда в документе 300–500 строк и нужно проверить сразу несколько условий.
Подсветка строк условным оформлением
Иногда нужно не найти одну строку, а увидеть все проблемные сразу: нулевую цену, пустой счёт учёта, отрицательное количество. Для этого служит условное оформление — правило «если поле равно X, раскрась строку».
Для пользователя в списках документов и справочников это делается через Ещё → Настроить список → Условное оформление. Для табличной части внутри документа такой настройки в меню нет. Её добавляет разработчик — в форме или через расширение, не трогая типовую конфигурацию
.
Пример: подсветить красным строки «Товаров», где цена равна нулю. Код ставится в ПриСозданииНаСервере формы документа (или в расширении этой формы):
&НаСервере
Процедура ПодсветитьНулевыеЦены()
Элемент = УсловноеОформление.Элементы.Добавить();
Поле = Элемент.Поля.Элементы.Добавить();
Поле.Поле = Новый ПолеКомпоновкиДанных("Товары");
Отбор = Элемент.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
Отбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Объект.Товары.Цена");
Отбор.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
Отбор.ПравоеЗначение = 0;
Элемент.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.Красный);
КонецПроцедуры
Здесь "Товары" — имя элемента формы (таблицы), а Объект.Товары.Цена — путь к данным. Если элемент таблицы на форме называется иначе, подставьте его имя: посмотреть можно в Конфигураторе, в дереве элементов формы.
Поиск строк табличной части запросом и кодом
Для разработчика есть три уровня поиска: внутри открытой формы, внутри одного объекта и по всей базе.
В открытой форме: НайтиСтроки и переход к строке
Коллекция табличной части в форме (ДанныеФормыКоллекция) поддерживает метод НайтиСтроки(). Он принимает структуру условий и возвращает массив подходящих строк. Чтобы поставить курсор на найденную строку, нужен её идентификатор:
&НаКлиенте
Процедура ПерейтиКНоменклатуре(Номенклатура)
Условие = Новый Структура("Номенклатура", Номенклатура);
Найденные = Объект.Товары.НайтиСтроки(Условие);
Если Найденные.Количество() = 0 Тогда
Сообщить("Позиция в документе не найдена");
Возврат;
КонецЕсли;
Элементы.Товары.ТекущаяСтрока = Найденные[0].ПолучитьИдентификатор();
Сообщить(СтрШаблон("Найдено строк: %1, первая — N %2",
Найденные.Количество(),
Формат(Найденные[0].НомерСтроки, "ЧГ=0")));
КонецПроцедуры
В структуру можно передать несколько полей: Новый Структура("Номенклатура, Склад", Ном, Скл). Строка подойдёт, только если совпали все.
Отбор строк в таблице формы
Если нужно показать пользователю только подходящие строки, используйте свойство ОтборСтрок элемента таблицы:
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("Номенклатура", Номенклатура);
Снять отбор — присвоить Неопределено. Строки при этом не удаляются, они просто скрыты. Документ записывается целиком.
В объекте на сервере: Найти
У табличной части объекта (ДокументОбъект.Товары) есть метод Найти(Значение, Колонки). Он возвращает первую строку, где значение совпало в одной из перечисленных колонок, или Неопределено:
Строка = ДокументОбъект.Товары.Найти(Номенклатура, "Номенклатура");
Если Строка <> Неопределено Тогда
Сообщить("Строка N " + Формат(Строка.НомерСтроки, "ЧГ=0"));
КонецЕсли;
Для нескольких условий — тот же НайтиСтроки() со структурой.
По всей базе: запрос к табличной части
Когда вопрос звучит как «в каких документах встречается этот товар», перебирать документы в цикле нельзя — это долго. Табличная часть доступна в запросе как отдельная таблица:
ВЫБРАТЬ
Товары.Ссылка КАК Документ,
Товары.НомерСтроки КАК НомерСтроки,
Товары.Количество КАК Количество
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК Товары
ГДЕ
Товары.Номенклатура = &Номенклатура
И Товары.Ссылка.Дата МЕЖДУ &Начало И &Конец
И Товары.Ссылка.Проведен
УПОРЯДОЧИТЬ ПО
Товары.Ссылка.Дата
Запрос возвращает документ и номер строки. Номер затем ищут в документе через Ctrl+F по колонке «N».
Горячие клавиши для работы с таблицей
| Сочетание | Что делает |
|---|---|
Ctrl+F | Поиск по текущей колонке |
Alt+F | Расширенный поиск в списках |
Ctrl+Q | Отменить поиск, вернуть все строки |
Ctrl+Home / Ctrl+End | Перейти к первой / последней строке |
PageUp / PageDown | Листать таблицу страницами |
F2 | Начать редактирование ячейки |
Ins | Добавить строку |
F9 | Скопировать текущую строку |
Полный список сочетаний для своей версии платформы откройте через меню Справка в главном окне — там есть раздел про сочетания клавиш.
В длинной табличной части после Ctrl+End вы сразу видите номер последней строки — это быстрый способ проверить, сколько позиций загрузилось из файла, не листая документ.
Поиск в динамических списках и больших таблицах
Журналы документов, списки справочников и регистров — это динамические списки. Поиск в них устроен иначе, чем в табличной части документа.
- 🔎 Строка поиска в правом верхнем углу списка ищет сразу по всем видимым колонкам. Достаточно начать вводить текст.
- 🧭 Расширенный поиск (
Alt+F) позволяет выбрать колонку и способ сравнения, как в окнеCtrl+Fтабличной части. - 🗂 Отбор через
Ещё → Настроить список → Отборзадаёт несколько условий сразу и сохраняется в настройках пользователя. - 📚 Полнотекстовый поиск ищет слово во всех реквизитах объектов. Он включается администратором и работает, только когда индекс обновлён.
Ключевое ограничение: строка поиска в журнале документов ищет по колонкам журнала, а не по строкам табличных частей. Найти в списке реализаций «все документы, где есть товар Болт М8» через строку поиска не получится. Для этого нужен отчёт или запрос.
Без программирования: универсальный отчёт
В Бухгалтерии 3.0 есть Отчеты → Универсальный отчет. В нём выбирают вид объекта «Документ», конкретный документ и его табличную часть. Дальше в настройках задают отбор по номенклатуре и период. Отчёт выводит документы и строки, где встречается позиция. Это пользовательская замена запросу из предыдущего раздела.
Регистр, пробелы и спецсимволы при поиске
Частая жалоба: «строка точно есть, а поиск её не находит». Причин несколько, и почти все — в символах, которых не видно.
Регистр в коде и запросе
Окно поиска платформы регистр не учитывает. Встроенный язык — учитывает: выражение "Болт" = "болт" вернёт Ложь. То же с функцией СтрНайти(). Для поиска без учёта регистра приводите обе строки к одному виду:
Если СтрНайти(НРег(Строка.Содержание), НРег(ИскомыйТекст)) > 0 Тогда
// строка подходит
КонецЕсли;
В запросах сравнение строк, как правило, регистр не учитывает, но поведение зависит от СУБД и её настроек сортировки. Надёжнее не полагаться на это и сравнивать данные, приведённые к одному регистру.
Спецсимволы в ПОДОБНО
В операторе ПОДОБНО символ % означает любую последовательность, _ — любой один символ, [...] — один символ из набора. Чтобы найти текст, где эти символы есть буквально, назначьте спецсимвол:
ГДЕ
Товары.Содержание ПОДОБНО "%10~%%" СПЕЦСИМВОЛ "~"
Такой шаблон найдёт строки, где встречается «10%».
Неразрывный пробел
Если данные пришли из Excel или с сайта, в них часто попадает неразрывный пробел. На экране он не отличается от обычного. Перед сравнением в коде заменяйте его: СтрЗаменить(Текст, Символы.НПП, " "), а затем обрезайте края через СокрЛП().
Своя команда поиска через расширение
Если бухгалтеры ежедневно ищут позиции в больших документах, разумно дать им отдельную кнопку. Её добавляют расширением конфигурации — типовая остаётся на поддержке и спокойно обновляется.
Что обычно делает такая команда:
- Спрашивает у пользователя значение — например, через выбор из справочника номенклатуры.
- Вызывает
НайтиСтроки()по табличной части. - Ставит курсор на первую найденную строку и сообщает, сколько совпадений.
- По повторному нажатию переходит к следующему совпадению.
Последний пункт решается просто: храните в реквизите формы индекс текущего совпадения и при каждом нажатии увеличивайте его по кругу. Код перехода к строке — тот же, что в примере с НайтиСтроки() выше, только вместо Найденные[0] берётся элемент с сохранённым индексом.
Альтернатива для разовых задач — внешняя обработка с запросом к табличной части. Её открывают через Файл → Открыть без изменения конфигурации. Для этого у пользователя должны быть права на открытие внешних обработок.