При разработке конфигураций на платформе 1С:Предприятие 8.3 часто возникают задачи по жесткому ограничению вводимых данных. Одной из таких задач является лимит на количество строк в табличной части (ТЧ). Это может быть продиктовано бизнес-логикой или техническими ограничениями, например, требованиями к макету печатной формы, где лишние строки могут "развалить" верстку. В данной статье мы разберем несколько способов реализации такого запрета, проанализируем их плюсы и минусы, а также выберем наиболее надежные методы.
Самый логичный и дружелюбный к пользователю способ — это пресечь попытку добавления лишней строки еще на этапе нажатия кнопки "Добавить". Для этого мы воспользуемся событием ПередНачаломДобавления элемента формы, связанного с табличной частью. Проанализируем, как это работает.
В этом событии платформа предоставляет нам параметр Отказ. Если мы установим его в значение Истина, действие будет прервано, и новая строка не появится. Давайте посмотрим на реализацию кода:
&НаКлиенте
Процедура ОсновныеХарактеристикиПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)
// Проверяем текущее количество строк в табличной части
// Если их уже 3, запрещаем добавление новой
Если Объект.ОсновныеХарактеристики.Количество() >= 3 Тогда
Отказ = Истина;
Сообщить("В табличную часть можно вводить не более 3-х строк!");
КонецЕсли;
КонецПроцедуры
В данном примере мы обращаемся непосредственно к данным объекта через Объект.ОсновныеХарактеристики.Количество(). Это гарантирует, что мы считаем актуальное количество строк в коллекции. Важно заметить, что мы используем условие "больше или равно 3", чтобы предотвратить ввод четвертой строки.
Более элегантным решением с точки зрения интерфейса является динамическое отключение возможности добавления строк. Вместо того чтобы выводить сообщение об ошибке после нажатия, мы можем просто сделать кнопку "Добавить" недоступной, когда лимит достигнут. Рассмотрим, как реализовать этот механизм.
Нам потребуется создать процедуру, которая будет обновлять состояние командной панели таблицы. Вызывать ее нужно при открытии формы и после каждого изменения состава строк (добавление или удаление).
&НаСервере
Процедура ОбновитьДоступностьДобавленияНаСервере()
// Управляем свойством РазрешитьДобавление элемента формы
ЛимитДостигнут = Объект.ОсновныеХарактеристики.Количество() >= 3;
Элементы.ОсновныеХарактеристики.РазрешитьДобавление = НЕ ЛимитДостигнут;
КонецПроцедуры
&НаКлиенте
Процедура ОсновныеХарактеристикиПослеУдаления(Элемент)
// После удаления строки нужно снова разрешить добавление
ОбновитьДоступностьДобавленияНаСервере();
КонецПроцедуры
Такой подход делает интерфейс "умным": пользователь сразу видит, что лимит исчерпан, так как кнопка "Добавить" становится серой. Однако помните, что это не отменяет необходимость программной проверки, так как данные могут быть изменены программно или через вставку из буфера.
Проверки на форме работают только тогда, когда пользователь взаимодействует с интерфейсом. Если данные в справочник будут записываться программно (например, через внешнюю обработку или интеграцию), проверки формы будут проигнорированы. Чтобы обеспечить целостность данных на уровне базы, необходимо добавить код в модуль самого справочника.
Разберем использование обработчика ПередЗаписью в модуле объекта:
Процедура ПередЗаписью(Отказ)
// Если это загрузка данных, проверку можно пропустить (по ситуации)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Проверяем количество значимых строк
Если ОсновныеХарактеристики.Количество() > 3 Тогда
ТекстСообщения = "Ошибка в объекте """ + Строка(ЭтотОбъект) + """:
|Превышено ограничение строк в табличной части (макс. 3).";
// Выводим сообщение пользователю
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , , , Отказ);
// Устанавливаем Отказ, чтобы запись не состоялась
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Этот метод является "последним рубежом" защиты. Проанализируем ситуацию: даже если злоумышленник или ошибка в коде попытается записать 4 строки, платформа выдаст ошибку и откатит транзакцию записи.
Современные версии 1С:Предприятие 8.3 поддерживают стандартные команды копирования и вставки строк. При вставке сразу нескольких строк событие ПередНачаломДобавления может вести себя не так, как ожидается. Чтобы полностью контролировать ситуацию, рекомендуется использовать событие ПередВставкойИзБуфераОбмена.
Рассмотрим логику проверки в этом случае:
&НаКлиенте
Процедура ОсновныеХарактеристикиПередВставкойИзБуфераОбмена(Элемент, ДанныеБуфера, Отказ)
ТекущееКол = Объект.ОсновныеХарактеристики.Количество();
КолВставляемых = ДанныеБуфера.Количество(); // Зависит от структуры данных в буфере
Если (ТекущееКол + КолВставляемых) > 3 Тогда
Сообщить("Вставка невозможна: будет превышен лимит в 3 строки.");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Иногда жесткий запрет на ввод данных раздражает пользователей. Проанализируем предложение одного из участников форума: "вводить всё, а в макет выводить только первые три". Это гибкий подход, который позволяет пользователю хранить историю или дополнительные данные, но сохраняет корректность печатной формы коммерческого предложения.
В коде формирования печатной формы это будет выглядеть следующим образом:
// В модуле менеджера или обработке печати
Счетчик = 0;
Для Каждого СтрокаТЧ Из СсылкаНаСправочник.ОсновныеХарактеристики Цикл
Счетчик = Счетчик + 1;
Если Счетчик > 3 Тогда
Прервать; // Выводим только первые 3 строки
КонецЕсли;
// Логика заполнения области макета...
ОбластьСтрока.Параметры.Заполнить(СтрокаТЧ);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Для создания качественного и надежного решения мы рекомендуем комбинировать подходы:
ПередНачаломДобавления для мгновенной реакции на действия пользователя.РазрешитьДобавление, чтобы визуально подсказывать пользователю границы дозволенного.ПередЗаписью для гарантии чистоты данных в базе.Объект.ОсновныеХарактеристики.Очистить() для удаления пустых или незначащих строк, если бизнес-логика это позволяет.Выяснив причину ограничений (макет печатной формы), мы понимаем, что технический запрет — это лишь средство обеспечения корректности бизнес-процесса. Выбирайте тот метод, который наиболее полно отвечает требованиям вашей задачи, сохраняя баланс между строгостью системы и удобством работы пользователя.