Как проверить, все ли товары выбраны пользователем в табличной части документа 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При разработке внешних обработок для автоматизации работы склада часто возникает задача контроля действий пользователя. В частности, необходимо убедиться, что кладовщик отметил все позиции в табличной части документа, прежде чем система автоматически изменит его статус на «Готов к отгрузке». В этой статье мы разберем несколько профессиональных подходов, которые помогут реализовать такую проверку максимально эффективно средствами платформы 1С.

Подход №1: Использование метода НайтиСтроки для простых проверок

Если ваша задача заключается в том, чтобы быстро проверить, остались ли в табличной части не отмеченные пользователем строки, самым лаконичным и быстрым способом будет использование метода НайтиСтроки. Этот метод позволяет отфильтровать коллекцию по заданному критерию.

Рассмотрим, как это реализовать на практике. Предположим, у нас есть таблица значений СписокДокументовПеремещений, в которой есть колонка Метка (тип Булево). Мы хотим узнать, есть ли хотя бы одна строка, где эта метка установлена в Ложь.


// Создаем структуру для поиска строк, где Метка = Ложь
СтруктураПоиска = Новый Структура("Метка", Ложь);

// Ищем все неотмеченные строки
НеотмеченныеСтроки = СписокДокументовПеремещений.НайтиСтроки(СтруктураПоиска);

// Если массив пуст, значит, все строки отмечены
Если НеотмеченныеСтроки.Количество() = 0 Тогда
    // Все товары отмечены, можно менять статус
    ВыполнитьСменуСтатуса();
Иначе
    // Сообщаем пользователю об ошибке
    Предупреждение("Не все товары выбраны!");
КонецЕсли;

Этот метод хорош тем, что платформа 1С выполняет поиск внутри коллекции очень быстро. Однако стоит учитывать, что этот способ проверяет наличие «неотмеченных строк» в общем списке, но не всегда учитывает логику уникальности товаров, если одна номенклатура может быть распределена по нескольким строкам.

Подход №2: Использование запроса к табличной части документа

Когда требуется стопроцентная гарантия того, что в интерфейсе отмечены все позиции, которые числятся в документе в базе данных, лучшим решением будет обращение к объекту Документ.ПеремещениеТоваров.Товары напрямую через Запрос. Это позволяет избежать ошибок, связанных с несоответствием данных в обработке и в оригинальном документе.

Разберем алгоритм действий:

  1. Выполняем запрос к табличной части исходного документа, чтобы получить актуальное количество позиций или список номенклатуры.
  2. Сравниваем полученные данные с количеством отмеченных строк в нашей внешней обработке.
  3. Если данные совпадают — все товары выбраны успешно.

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

Подход №3: Метод Свернуть для учета дублей

Бывают ситуации, когда в документе товар может встречаться в нескольких строках (например, с разными характеристиками или сериями), а кладовщик может отмечать их по отдельности. Чтобы проверить полноту выполнения задачи, мы можем воспользоваться методом Свернуть.

Давайте проанализируем этот сценарий по шагам:

Шаг 1: Сворачиваем исходную таблицу документа по номенклатуре с суммированием количества.


ТаблицаДляПроверки = Объект.Товары.Выгрузить();
ТаблицаДляПроверки.Свернуть("Номенклатура", "Количество");

Шаг 2: Аналогично сворачиваем данные, которые отметил кладовщик в нашей обработке.

Шаг 3: Сравниваем две таблицы. Если суммы по каждой номенклатурной позиции в обеих таблицах идентичны, значит, кладовщик действительно обработал весь объем товаров, требуемый по документу.

Использование метода Свернуть особенно удобно, когда важно не просто наличие «галочки» в строке, а подтверждение того, что весь объем товаров был проверен.

Заключение и рекомендации

Мы проанализировали три основных пути решения задачи. Подведем итоги:

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

← На главную