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