В разработке на платформе 1С:Предприятие 7.7 часто возникают ситуации, когда стандартные реквизиты справочника, такие как Наименование или Код, оказываются избыточными. Например, если справочник используется для хранения технических идентификаторов (ИСН, штрихкоды, артикулы), где смысловую нагрузку несет только одно поле. В рамках данной статьи мы подробно разберем, как технически грамотно избавиться от наименования, настроить жесткую проверку вводимых данных и решить специфические проблемы интерфейса, связанные с клавишей Esc.
Рассмотрим ситуацию, когда нам необходимо сделать справочник, в котором визуально и функционально отсутствует поле Наименование. В 1С 7.7 это решается не программным удалением объекта, а через изменение свойств метаданных.
Разберем этот процесс по шагам:
Важный нюанс: Платформа 7.7 позволяет одновременно установить в 0 длину и кода, и наименования. Проанализируем последствия такого решения: если оба поля имеют нулевую длину, система перестанет отображать стандартные колонки в форме списка. Однако в этом случае "Основным представлением" элемента станет первый созданный вами дополнительный реквизит. Если же реквизитов нет вовсе, вы получите пустую строку в списке, что сделает работу пользователя невозможной.
Посмотрим на поведение системы при обращении к пустому наименованию из кода. Если в отчете или обработке встретится обращение вида Спр.Наименование, система не выдаст критическую ошибку. Она просто вернет пустое значение (пустую строку). Это позволяет сохранять работоспособность старых алгоритмов даже после модификации структуры данных.
Довольно часто требуется, чтобы поле (например, Код или пользовательский реквизит ИСН) соответствовало строгому формату — например, состояло ровно из 9 цифр. Рассмотрим, как реализовать такую проверку в модуле формы справочника.
Наиболее логичным местом для проверки является предопределенная процедура ПриЗаписи(). Проанализируем пример кода:
Процедура ПриЗаписи()
// Проверяем длину введенного наименования (или кода)
ДлинаВвода = СтрДлина(СокрЛП(Наименование));
Если ДлинаВвода < 9 Тогда
Предупреждение("Данные введены некорректно! ИСН должен состоять минимум из 9 цифр.");
// Отменяем запись элемента
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецПроцедуры
В данном примере мы используем СтатусВозврата(0), чтобы заблокировать запись объекта в базу данных, если условие не выполнено. Однако здесь кроется главная проблема интерфейса 1С 7.7: при редактировании непосредственно в списке пользователь может "застрять" в текущей строке.
Выясним причину, по которой стандартная клавиша Esc перестает работать. Если вы добавили на форму справочника кнопку с формулой Форма.Закрыть(0) (что часто делается для удобства закрытия окна), это может нарушить стандартную обработку событий клавиатуры в 1С. Когда ПриЗаписи() возвращает 0, система ожидает продолжения редактирования. Но если фокус управления перехвачен кнопкой, попытка отменить ввод через Esc игнорируется, так как программа считает, что пользователь обязан ввести корректные данные.
Рассмотрим несколько способов решения этой задачи:
Способ 1: Отказ от редактирования в списке. Самый надежный, хотя и менее удобный для пользователя вариант — создание отдельной формы элемента. В этом случае диалоговое окно формы берет на себя управление процессом записи и закрытия, и конфликтов с Esc не возникает.
Способ 2: Использование Windows Script Host. Если вам крайне важно сохранить редактирование в списке и принудительно эмулировать нажатие клавиши отмены, можно прибегнуть к возможностям операционной системы. Рассмотрим программный вызов системного нажатия Esc:
Процедура ВыйтиИЗРедактирования()
Попытка
WSHShell = СоздатьОбъект("WScript.Shell");
// Посылаем сигнал клавиши Escape в активное окно
WSHShell.SendKeys("{ESC}");
Исключение
// Если объект не создался (например, запрет прав), просто закрываем
Форма.Закрыть(0);
КонецПопытки;
КонецПроцедуры
Способ 3: Настройка свойств кнопки. Чтобы кнопка "Закрыть" не мешала процессу ввода, попробуем в свойствах кнопки на форме установить флажок "Пропускать при вводе". Это может помочь сохранить фокус в табличной части и позволит системе корректно обрабатывать стандартные горячие клавиши.
Если справочник является чисто техническим и ввод новых элементов вручную вообще не предусмотрен (или ограничен), полезно использовать процедуру ВводНового(). Разберем пример:
Процедура ВводНового(Копирование)
Предупреждение("Ввод новых элементов в данный справочник разрешен только программно или через обработку импорта!");
СтатусВозврата(0);
Возврат;
КонецПроцедуры
Такой подход гарантирует, что структура данных не будет нарушена случайными действиями пользователей, а все проверки (например, на те же 9 цифр) будут выполняться централизованно в модуле объекта или внешней обработке.
Резюмируем: Для удаления наименования используем Конфигуратор (длина = 0). Для контроля корректности данных применяем ПриЗаписи() со СтатусВозврата(0). А для того, чтобы интерфейс оставался отзывчивым, стараемся не перегружать форму лишними кнопками управления, которые могут конфликтовать с системными событиями платформы 1С 7.7.