Документы и Печать · 11 мин
Как найти строку в документе 1С
Как найти строку в документе 1С: поиск в табличной части через Ctrl+F, отбор по колонке, программный поиск методом Найти. Примеры кода и типичные ошибки.
В документах 1С есть два разных сценария поиска строки. Первый — пользовательский: вы открыли документ и хотите быстро найти нужную позицию в табличной части «Товары» или «Услуги». Второй — программный: в обработке или модуле нужно найти строку в табличной части по значению реквизита, чтобы изменить её, проверить дубль или рассчитать итог. Оба сценария разбираются ниже с точными действиями.
Пользовательский поиск не требует прав разработчика и доступен в любой типовой конфигурации: «1С:Бухгалтерия», «Управление торговлей», «Зарплата и управление персоналом». Программный поиск выполняется на встроенном языке 1С и требует понимания структуры объекта — имён табличных частей и их реквизитов.
Важное ограничение: стандартный интерактивный поиск в табличной части работает только по текущей колонке. Если вы ищете по наименованию товара, курсор должен стоять в колонке «Номенклатура», а не «Количество» — иначе поиск ничего не найдёт или найдёт не то.
Поиск строки в открытом документе через Ctrl+F
Откройте документ и установите курсор в любую ячейку той колонки табличной части, по которой хотите искать. Например, чтобы найти строку с конкретным товаром, кликните в колонку «Номенклатура».
Нажмите Ctrl+F, введите искомое значение и нажмите «Искать». Платформа подсветит первую подходящую строку. Повторное нажатие кнопки поиска или F3 переводит на следующее совпадение. Если совпадений нет, появится сообщение «Строка не найдена».
Поиск работает по принципу «с начала строки» или «по точному совпадению» в зависимости от настроек диалога. Если ищете по фрагменту наименования, отметьте вариант «по части слова» или используйте поиск по подстроке, если конфигурация его предлагает. Учитывайте регистр и лишние пробелы: «Гвоздь 6х200» и «Гвоздь 6х200 » с пробелом в конце — разные значения для точного поиска.
- 1Откройте документ и перейдите на вкладку с нужной табличной частью
- 2Поставьте курсор в колонку, по которой выполняется поиск
- 3Нажмите Ctrl+F и введите искомое значение
- 4Нажмите «Искать», для следующего совпадения — F3
- 5Проверьте, что найденная строка — именно та, что нужна (сверьте соседние колонки)
Отбор строк по колонке вместо поиска
Когда нужно не перепрыгнуть к одной строке, а увидеть все строки с определённым товаром или контрагентом, удобнее отбор. В большинстве типовых форм табличных частей доступна команда отбора: правой кнопкой по заголовку колонки или через меню «Ещё» табличной части — «Установить отбор и сортировку списка».
Укажите поле (например, «Номенклатура»), вид сравнения («Равно», «Содержит») и значение. После применения в табличной части останутся только подходящие строки. Это безопасно: отбор влияет только на отображение, сами данные документа не меняются. Чтобы вернуть полный список, отключите отбор тем же меню.
Ограничение: в некоторых формах документов отбор по табличной части отключён разработчиком конфигурации. Если команда недоступна, остаются поиск по Ctrl+F, сортировка по колонке либо вывод табличной части в табличный документ через «Ещё» — «Вывести список» с последующим поиском там.
Поиск документа по строке в списке документов
Иногда задача обратная: найти не строку внутри документа, а сам документ, содержащий нужное значение. В журнале документов используйте строку поиска над списком (в управляемых формах) — она ищет по отображаемым колонкам: номеру, дате, контрагенту, комментарию.
Для поиска по содержимому табличных частей (например, найти все реализации с конкретным товаром) стандартной строки поиска недостаточно. Используйте отчёты: «Движения документа», обороты по счёту с субконто «Номенклатура», карточку номенклатуры с закладкой документов. Во многих конфигурациях есть универсальный отчёт или консоль, позволяющая отобрать документы по любому реквизиту.
Программный поиск строки методом Найти()
Для поиска строки табличной части в коде используется метод Найти() коллекции строк. Он принимает искомое значение и имя колонки (или список колонок через запятую) и возвращает первую найденную строку либо Неопределено, если совпадений нет.
СтрокаТовара = ДокументОбъект.Товары.Найти(ИскомаяНоменклатура, "Номенклатура");
Если СтрокаТовара <> Неопределено Тогда
СтрокаТовара.Количество = СтрокаТовара.Количество + 1;
Иначе
НоваяСтрока = ДокументОбъект.Товары.Добавить();
НоваяСтрока.Номенклатура = ИскомаяНоменклатура;
НоваяСтрока.Количество = 1;
КонецЕсли;
Поиск по нескольким колонкам выполняется перечислением имён через запятую: Найти(Значение, "Номенклатура,Характеристика") — но тогда одно и то же значение ищется во всех указанных колонках. Если по каждой колонке своё значение, используйте структуру отбора с методом НайтиСтроки().
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", ИскомаяНоменклатура);
Отбор.Вставить("Склад", ИскомыйСклад);
НайденныеСтроки = ДокументОбъект.Товары.НайтиСтроки(Отбор);
Для Каждого СтрокаТовара Из НайденныеСтроки Цикл
// обработка каждой найденной строки
КонецЦикла;
Разница между методами принципиальна: Найти() возвращает одну первую строку, НайтиСтроки() — массив всех совпадений. Если в документе возможны дубли товара с разными склами или характеристиками, Найти() может вернуть не ту строку.
СтрокаТовара = ДокументОбъект.Товары.Найти(Номенклатура, "Номенклатура");Поиск по подстроке и перебор строк
Методы Найти() и НайтиСтроки() сравнивают значения на точное равенство. Если нужно найти строку по фрагменту наименования или комментария, перебирайте табличную часть в цикле с функцией СтрНайти().
Для Каждого СтрокаТовара Из ДокументОбъект.Товары Цикл
Если СтрНайти(НРег(СтрокаТовара.Номенклатура.Наименование), НРег(Фрагмент)) > 0 Тогда
// строка содержит искомый фрагмент
КонецЕсли;
КонецЦикла;
Обратите внимание: сравнивать строку с наименованием нельзя напрямую, если в колонке хранится ссылка на справочник, — сначала обратитесь к реквизиту ссылки (СтрокаТовара.Номенклатура.Наименование). Для регистронезависимого поиска приводите обе строки к одному регистру через НРег() или ВРег().
Перебор в цикле медленнее встроенных методов на больших табличных частях. Если строк тысячи, а поиск точный — предпочтительнее НайтиСтроки(). Цикл с СтрНайти() оправдан только для поиска по подстроке или сложных условий.
Сравнение способов поиска
Быстро для разового поиска; ищет только по текущей колонке
Показывает все совпадения сразу; доступен не во всех формах
Точное совпадение, возвращает одну строку; не ищет по подстроке
Отбор по нескольким колонкам с разными значениями; только точное равенство
Поиск по фрагменту текста; медленнее на больших таблицах
Типичные ошибки и ограничения
Самая частая пользовательская ошибка — поиск не в той колонке. Курсор стоит в «Количестве», а ищется наименование товара: платформа честно ищет текст «Гвоздь» среди чисел и ничего не находит. Перед поиском проверяйте активную колонку.
Вторая ошибка — невидимые различия в строках: лишние пробелы, неразрывные пробелы после копирования из Excel, разный регистр, буквы «е» и «ё». Если точный поиск не находит заведомо существующее значение, попробуйте поиск по короткому уникальному фрагменту.
В коде типичны три проблемы. Первая — обращение к несуществующему имени табличной части или реквизита: имя должно совпадать с метаданными конфигурации, а не с заголовком на форме («Товары», а не «Табличная часть»). Вторая — забытая проверка на Неопределено после Найти(): обращение к свойству ненайденной строки вызывает ошибку выполнения. Третья — изменение коллекции внутри цикла перебора: удаление строк в цикле Для Каждого приводит к пропуску строк, удаляйте по найденным индексам с конца или собирайте строки в массив заранее.
Проверка результата и безопасная работа
После интерактивного поиска убедитесь, что найдена именно нужная строка: сверьте значения соседних колонок — количество, цену, склад, характеристику. Одинаковые товары с разными характеристиками визуально похожи, и легко отредактировать не ту позицию.
Программный поиск проверяйте отладчиком: поставьте точку останова после Найти() и посмотрите, что вернул метод — строку или Неопределено. Для НайтиСтроки() проверьте НайденныеСтроки.Количество(): ноль означает, что условия отбора не совпали ни с одной строкой.
Любые программные изменения табличной части тестируйте на копии базы. Методы поиска сами по себе данные не меняют, но типовой сценарий — найти строку и изменить её, после чего документ записывается и перепроводится. Ошибка в условии поиска может массово испортить данные, а откат без резервной копии затруднён.
Как проверить результат
Возвращена строка, поля доступны
Неопределено — условие не совпало ни с одной строкой
Больше нуля, состав строк соответствует ожиданию
Ноль — проверьте имена реквизитов и значения отбора
Соседние колонки (количество, склад, характеристика) совпадают с ожидаемыми
Найден похожий товар с другой характеристикой или складом
Что важно запомнить
Интерактивно строку ищут через Ctrl+F по текущей колонке или отбором; программно — методом Найти() для одной строки и НайтиСтроки() со структурой для всех совпадений. Оба метода сравнивают точно, поэтому для поиска по фрагменту используйте цикл со СтрНайти(). Всегда проверяйте результат на Неопределено и тестируйте изменения на копии базы.
Частые вопросы
Почему Ctrl+F не находит строку, которая точно есть в документе?
Чаще всего курсор стоит не в той колонке — поиск идёт только по активной. Также проверьте лишние пробелы в искомом тексте, регистр букв и различие «е»/«ё». Попробуйте искать по короткому уникальному фрагменту значения.
Чем Найти() отличается от НайтиСтроки()?
Найти() возвращает первую подходящую строку или Неопределено и подходит, когда совпадение может быть только одно. НайтиСтроки() принимает структуру отбора по нескольким реквизитам и возвращает массив всех совпадений — используйте его, когда дубли возможны или условий несколько.
Можно ли программно найти строку по части наименования товара?
Методы Найти() и НайтиСтроки() сравнивают только на точное равенство. Для поиска по фрагменту переберите табличную часть в цикле и проверяйте вхождение через СтрНайти(), приводя обе строки к одному регистру функцией НРег().
Как найти все документы, содержащие конкретный товар?
Строка поиска в журнале документов по табличным частям не ищет. Используйте отчёты: карточку номенклатуры со списком документов, обороты по счёту с субконто «Номенклатура» или универсальный отчёт с отбором по реквизиту табличной части.
Опасно ли искать строку в чужом проведённом документе?
Сам поиск и отбор данные не меняют и абсолютно безопасны. Риск появляется при последующем редактировании: запись и перепроведение документа изменят движения по регистрам. Перед правкой убедитесь, что у вас есть полномочия, а документ не закрыт периодом или согласованием.
Что делать, если Найти() возвращает Неопределено, хотя значение есть?
Проверьте имя реквизита — оно должно совпадать с именем в конфигураторе, а не с заголовком на форме. Затем убедитесь, что сравниваются значения одного типа: ссылка на справочник не равна строке с её наименованием. В отладчике посмотрите фактическое значение в колонке и в переменной поиска.