При разработке внешних обработок для автоматизации работы склада часто возникает задача контроля действий пользователя. В частности, необходимо убедиться, что кладовщик отметил все позиции в табличной части документа, прежде чем система автоматически изменит его статус на «Готов к отгрузке». В этой статье мы разберем несколько профессиональных подходов, которые помогут реализовать такую проверку максимально эффективно средствами платформы 1С.
НайтиСтроки для простых проверокЕсли ваша задача заключается в том, чтобы быстро проверить, остались ли в табличной части не отмеченные пользователем строки, самым лаконичным и быстрым способом будет использование метода НайтиСтроки. Этот метод позволяет отфильтровать коллекцию по заданному критерию.
Рассмотрим, как это реализовать на практике. Предположим, у нас есть таблица значений СписокДокументовПеремещений, в которой есть колонка Метка (тип Булево). Мы хотим узнать, есть ли хотя бы одна строка, где эта метка установлена в Ложь.
// Создаем структуру для поиска строк, где Метка = Ложь
СтруктураПоиска = Новый Структура("Метка", Ложь);
// Ищем все неотмеченные строки
НеотмеченныеСтроки = СписокДокументовПеремещений.НайтиСтроки(СтруктураПоиска);
// Если массив пуст, значит, все строки отмечены
Если НеотмеченныеСтроки.Количество() = 0 Тогда
// Все товары отмечены, можно менять статус
ВыполнитьСменуСтатуса();
Иначе
// Сообщаем пользователю об ошибке
Предупреждение("Не все товары выбраны!");
КонецЕсли;
Этот метод хорош тем, что платформа 1С выполняет поиск внутри коллекции очень быстро. Однако стоит учитывать, что этот способ проверяет наличие «неотмеченных строк» в общем списке, но не всегда учитывает логику уникальности товаров, если одна номенклатура может быть распределена по нескольким строкам.
Когда требуется стопроцентная гарантия того, что в интерфейсе отмечены все позиции, которые числятся в документе в базе данных, лучшим решением будет обращение к объекту Документ.ПеремещениеТоваров.Товары напрямую через Запрос. Это позволяет избежать ошибок, связанных с несоответствием данных в обработке и в оригинальном документе.
Разберем алгоритм действий:
Такой подход защищает систему от логических ошибок пользователя и обеспечивает целостность данных при смене статуса документа.
Свернуть для учета дублейБывают ситуации, когда в документе товар может встречаться в нескольких строках (например, с разными характеристиками или сериями), а кладовщик может отмечать их по отдельности. Чтобы проверить полноту выполнения задачи, мы можем воспользоваться методом Свернуть.
Давайте проанализируем этот сценарий по шагам:
Шаг 1: Сворачиваем исходную таблицу документа по номенклатуре с суммированием количества.
ТаблицаДляПроверки = Объект.Товары.Выгрузить();
ТаблицаДляПроверки.Свернуть("Номенклатура", "Количество");
Шаг 2: Аналогично сворачиваем данные, которые отметил кладовщик в нашей обработке.
Шаг 3: Сравниваем две таблицы. Если суммы по каждой номенклатурной позиции в обеих таблицах идентичны, значит, кладовщик действительно обработал весь объем товаров, требуемый по документу.
Использование метода Свернуть особенно удобно, когда важно не просто наличие «галочки» в строке, а подтверждение того, что весь объем товаров был проверен.
Мы проанализировали три основных пути решения задачи. Подведем итоги:
НайтиСтроки с объектом Структура. Это самый чистый код для стандартных задач.Запрос к табличной части документа.Свернуть, чтобы привести обе сравниваемые выборки к единому виду.Избегайте ручных переборов в циклах с созданием множества промежуточных массивов — в 1С:Предприятии есть встроенные высокопроизводительные методы, которые решают подобные задачи гораздо быстрее и надежнее.