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