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