В процессе разработки часто возникает задача контроля ввода данных, когда необходимо убедиться, что сотрудник еще не был «отмечен» в других документах за выбранную дату. Рассмотрим, как реализовать такую проверку, если бизнес-логика запрещает проводить документы до конца отчетного периода.
Когда проведение документов невозможно, единственным верным способом получения данных является прямой запрос к табличной части документов. Основная сложность заключается в необходимости оптимизации кода, чтобы не создавать 31 дублирующую процедуру для каждого дня месяца.
Вместо того чтобы писать отдельный обработчик для каждого поля, мы воспользуемся возможностью передачи имени элемента в универсальную функцию. При изменении значения в ячейке, мы можем определить, какой именно день редактирует пользователь.
Рассмотрим, как реализовать универсальную процедуру на сервере:
&НаСервереБезКонтекста
Процедура ПроверитьЗаполнениеДняНаСервере(ИмяРеквизита, ДатаДок, ФИО, ТекущаяСсылка)
// Формируем текст запроса динамически
ТекстЗапроса = "ВЫБРАТЬ
| ТабельСписок.Ссылка.Номер КАК Номер,
| ТабельСписок.НомерЗадания КАК НомерЗадания,
| ТабельСписок.Ответственный КАК Ответственный
|ИЗ
| Документ.Табель.Список КАК ТабельСписок
|ГДЕ
| ТабельСписок.ДатаДок = &ДатаДок
| И ТабельСписок.ФИО = &ФИО
| И ТабельСписок.Ссылка <> &ТекущаяСсылка
| И ТабельСписок.%ИмяРеквизита% > 0";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%ИмяРеквизита%", ИмяРеквизита);
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("ДатаДок", ДатаДок);
Запрос.УстановитьПараметр("ФИО", ФИО);
Запрос.УстановитьПараметр("ТекущаяСсылка", ТекущаяСсылка);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить("Сотрудник уже учтен в документе № " + Выборка.Номер);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Чтобы вызывать эту процедуру из любого поля табличной части, используйте событие ПриИзменении или ОкончаниеВводаТекста. В обработчике события доступен параметр Элемент, из которого мы можем извлечь имя реквизита.
Алгоритм действий:
Элемент.Имя.Ссылка <> &ТекущаяСсылка, чтобы исключить проверку данных внутри самого редактируемого документа.Несмотря на то, что проверка при вводе значительно повышает удобство пользователя, помните о следующих нюансах:
РегистрСведений. Вы можете записывать в него данные в момент нажатия кнопки «Записать», что позволит выполнять проверки через быстрый запрос к регистру, а не к тяжелым табличным частям документов.Условное оформление формы для подсвечивания ячеек красным цветом, если данные по этому сотруднику уже существуют в базе. Это даст пользователю мгновенную обратную связь без вызова модальных окон с ошибками.Используя предложенный подход с динамическим формированием текста запроса, вы сможете сократить объем модуля с сотен строк до нескольких десятков, сделав код гибким и легко поддерживаемым.