В практике разработки на платформе 1С часто встречается ситуация: в выпадающем списке или поле выбора отображаются все необходимые элементы, но при попытке выбрать конкретный счет (например, программно созданный 106.хП), система упорно подставляет другой элемент — обычно вышестоящий или родительский (106.00). Особенно остро эта проблема проявляется после обновлений конфигурации или платформы. Разберем детально причины такого поведения и способы его устранения.
Когда мы работаем с Планом счетов, важно помнить, что это не просто справочник, а сложный объект метаданных с жесткой иерархией. В отличие от обычных справочников, счета имеют служебные реквизиты, которые напрямую влияют на то, как платформа «видит» их в интерфейсе. Если счет создается программно, а не в конфигураторе, часть этих реквизитов может остаться незаполненной, что приводит к «схлопыванию» выбора.
Рассмотрим ситуацию, когда при выборе счета 106.хП система возвращает 106.00. Это означает, что для платформы эти два объекта выглядят идентично в контексте поиска или сортировки. Проанализируем основные причины этой ошибки.
Одной из самых частых причин является отсутствие значения в системном реквизите Порядок. Этот реквизит используется платформой 1С для визуального упорядочивания счетов и корректной работы механизмов автоподбора. Если у нового счета 106.хП этот реквизит пуст или совпадает с родителем, система при выборе по строке или из списка может просто выбрать первый попавшийся элемент с таким «весом».
Как исправить: При программном создании счета необходимо убедиться, что вы вызываете метод записи, который корректно обновляет иерархию, или заполняете порядок явно. Посмотрим на пример правильного создания счета:
НовыйСчет = ПланыСчетов.Хозрасчетный.СоздатьСчет();
НовыйСчет.Код = "106.хП";
НовыйСчет.Наименование = "Вложения в основные средства (особые)";
НовыйСчет.Родитель = ПланыСчетов.Хозрасчетный.НайтиПоКоду("106.00");
// Устанавливаем признаки счета
НовыйСчет.Вид = ВидСчета.Активный;
НовыйСчет.ЗапретитьИспользоватьВПроводках = Ложь;
// Важно: Порядок обычно формируется платформой,
// но при программном добавлении стоит проверить его наличие
НовыйСчет.Записать();
Если проблема появилась сразу после обновления, велика вероятность, что клиентское приложение использует устаревший кэш метаданных. Платформа «помнит» старую структуру плана счетов, и когда вы пытаетесь выбрать новый элемент, идентификаторы в кэше и в базе данных не совпадают. В итоге система откатывается к ближайшему «понятному» ей элементу — родителю 106.00.
Разберем шаги по очистке кэша:
/ClearCache.Выясним, как настроено поле выбора на форме. Если у элемента формы включено свойство Быстрый выбор, 1С пытается найти элемент по строке. Если код 106.хП содержит символы, которые платформа воспринимает как разделители (например, точку), или если наименование счета начинается так же, как у родителя, автоподбор может сработать некорректно.
Проанализируем настройки поля формы:
Даже если в коде нет явного обработчика НачалоВыбора, на само поле могут быть наложены ограничения в конфигураторе. Проверим свойство Параметры выбора и Связи параметров выбора.
Часто там устанавливается фильтр: Отбор.ЭтоГруппа(Ложь). Если при создании счета 106.хП вы забыли указать родителя или неверно определили признак Счет является субсчетом, система может посчитать его группой. В этом случае счет будет виден в списке, но платформа запретит его выбор в поле, предназначенное только для конечных счетов (субсчетов), и «сбросит» значение на предыдущее или родительское.
Посмотрим, как проверить признак субсчета программно:
// Проверяем, является ли выбранный объект субсчетом
Если Не ВыбранныйСчет.ЭтоГруппа Тогда
Сообщить("Счет доступен для выбора в проводках");
КонецЕсли;
В планах счетов 1С точка (.) — это не просто символ, а системный разделитель уровней. Если структура кода вашего счета (106.хП) нарушает маску кода, заданную в свойствах Плана счетов в конфигураторе, механизмы платформы могут работать непредсказуемо.
Разберем ситуацию: если маска кода предполагает формат XXX.XX.X, а вы пытаетесь записать код с произвольным набором символов после точки, индекс поиска может «сломаться». Платформа при поиске будет отсекать символы после точки и находить только 106.00.
Рекомендация: Проверьте длину кода и маску в конфигураторе. Код программно созданного счета должен строго соответствовать правилам, заданным для всего Плана счетов.
Код, Порядок, Родитель и Вид у проблемного счета.Записать() без параметров, которые могут блокировать обновление индексов.ПланСчетовСсылка без каких-либо настроек отбора. Если в нем счет выбирается корректно — ищите проблему в настройках (параметрах выбора) исходного поля.Таким образом, чаще всего проблема кроется не в отсутствии обработчика, а в «неполноценности» программно созданного объекта с точки зрения метаданных платформы 1С. Тщательная проверка системных полей счета обычно позволяет решить вопрос без написания сложного кода.