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