Как правильно использовать объект Структура и параметры отбора в 1С:Предприятие

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разбор синтаксиса конструктора Структура

Начнем с основ, которые часто вызывают вопросы у начинающих программистов. Рассмотрим код, представленный в вопросе:


ПараметрыОтбора = Новый Структура("Номенклатура", Номенклатура);
СтрокиТЧ = Объект.Товары.НайтиСтроки(ПараметрыОтбора);

Проанализируем первую строку. Здесь происходит создание нового объекта типа Структура. В языке 1С структура — это коллекция, состоящая из пар "Ключ" и "Значение".

  1. "Номенклатура" (в кавычках) — это Ключ. Ключ всегда является строкой и служит уникальным именем, по которому мы будем обращаться к данным. Важно помнить, что имя ключа должно соответствовать правилам именования переменных (никаких пробелов или спецсимволов, кроме подчеркивания).
  2. Номенклатура (без кавычек) — это Значение. В данном случае это переменная, в которой хранится конкретная ссылка на товар, выбранный пользователем или полученный программно.

Выясним причину, почему это важно. Когда мы передаем эту структуру в метод НайтиСтроки, платформа "смотрит" на имя ключа ("Номенклатура"), ищет в табличной части колонку с точно таким же именем и фильтрует строки, где значение в этой колонке совпадает с нашим значением (содержимым переменной Номенклатура).

Рассмотрим альтернативный способ создания структуры, который часто бывает удобнее при работе с большим количеством параметров:


ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Номенклатура", СсылкаНаТовар);
ПараметрыОтбора.Вставить("Склад", СсылкаНаСклад);

Также конструктор позволяет инициализировать несколько ключей одной строкой, разделяя их запятыми:

ПараметрыОтбора = Новый Структура("Номенклатура, Склад", Номенклатура, Склад);

Метод НайтиСтроки: Особенности и ограничения

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

Во-первых, метод всегда возвращает Массив. Даже если под критерии поиска подходит всего одна строка или не подходит ни одной, результатом будет объект типа Массив. Если строки не найдены, массив будет пустым (его количество элементов будет равно 0).

Разберем по шагам, как правильно обработать результат поиска:


ПараметрыОтбора = Новый Структура("Цвет", "Красный");
НайденныеСтроки = Объект.Товары.НайтиСтроки(ПараметрыОтбора);

Если НайденныеСтроки.Количество() > 0 Тогда
    // Мы нашли как минимум одну строку. Обращаемся к первой:
    ПерваяСтрока = НайденныеСтроки[0];
    ПерваяСтрока.Цена = 100; // Изменения отразятся в самой таблице
КонецЕсли;

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

В-третьих, ограничение по операторам. С помощью структуры и метода НайтиСтроки можно реализовать поиск только по условию "Равно". Если вам нужно найти строки, где цена "больше 100" или дата "не равна" текущей, данный метод не подойдет — здесь потребуется либо перебор коллекции в цикле, либо использование запроса.

Передача параметров в запросы через УстановитьПараметр

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

Посмотрим на пример правильной установки параметра:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   Остатки.Номенклатура,
    |   Остатки.КоличествоОстаток
    |ИЗ
    |   РегистрНакопления.ТоварыНаСкладах.Остатки(&ПериодГраница, ) КАК Остатки";

Запрос.УстановитьПараметр("ПериодГраница", КонецДня(ТекущаяДата()));

Проанализируем важные моменты:

Сравнение подходов: НайтиСтроки против Запроса

Для оптимизации работы конфигурации программист должен понимать, когда использовать поиск в памяти, а когда обращаться к базе данных.

Ситуация А: Использование НайтиСтроки
Предположим, у вас открыт документ "Реализация товаров и услуг", и в нем 50 строк. Пользователь меняет склад в шапке, и вам нужно быстро пересчитать цены во всех строках табличной части. В этом случае НайтиСтроки — идеальный вариант. Данные уже в памяти, обращение к ним мгновенно, и нет смысла делать лишний вызов сервера SQL.

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

Советы по повышению производительности

Если вы все же используете НайтиСтроки для очень больших Таблиц Значений (например, при сложной обработке данных в памяти), вы можете значительно ускорить процесс с помощью индексации. Индексы позволяют платформе не перебирать все строки подряд, а использовать оптимизированные алгоритмы поиска.

Рассмотрим пример создания индекса:


ТЗ_Данные = Новый ТаблицаЗначений;
ТЗ_Данные.Колонки.Добавить("Артикул");
ТЗ_Данные.Колонки.Добавить("Цена");

// Добавляем индекс по колонке Артикул
ТЗ_Данные.Индексы.Добавить("Артикул");

// Теперь поиск будет работать в разы быстрее на больших объемах
Параметры = Новый Структура("Артикул", "ABC-123");
Найденные = ТЗ_Данные.НайтиСтроки(Параметры);

Подводя итог, можно сказать: всегда четко разделяйте имя ключа/параметра (строка в кавычках) и само значение (переменная или результат функции). Это базовый принцип, на котором строится взаимодействие большинства объектов в системе 1С:Предприятие.

← На главную