В процессе работы с конфигурациями на базе 1С:Предприятие 8.3 (такими как 1С:ERP, УТ 11 или КА 2) программисты часто сталкиваются с загадочным поведением динамических списков. Одной из наиболее раздражающих проблем является ситуация, когда в колонке ИНН справочника Партнеры внезапно начинает отображаться только первый символ номера. При этом, если мы обратимся к данным программно через Элементы.Список.CurrentData, мы увидим полную строку, но визуально в таблице и в окне отборов доступен лишь один знак.
В этой статье мы подробно разберем, почему так происходит, проанализируем внутренние механизмы платформы и рассмотрим пошаговые инструкции по устранению данной ошибки.
Для начала проанализируем ситуацию. Динамический список — это сложный объект, который не просто выполняет запрос к базе данных, но и пытается оптимизировать отображение. Основная причина нашей проблемы кроется в механизме автоматического определения типов.
Когда динамический список инициализируется, платформа анализирует результат запроса, чтобы выделить память под колонки и определить их формат. Если в тексте запроса используется ЛЕВОЕ СОЕДИНЕНИЕ (Left Join) с таблицей контрагентов (что типично для справочника Партнеры), и в первых нескольких записях выборки поле ИНН оказывается пустым (NULL) или содержит пустую строку, платформа может ошибочно интерпретировать это поле как Строка(1).
Рассмотрим подробнее факторы, влияющие на это поведение:
"" КАК ИНН или ЕСТЬNULL(Таблица.ИНН, ""), он может назначить минимальную длину строки для всей колонки.Партнеры и Контрагенты разделены. Если у партнера не указан основной контрагент, запрос возвращает NULL. Именно этот NULL часто сбивает платформу с толку при определении длины поля.Самый надежный и правильный метод — это явно указать платформе, какую длину строки мы ожидаем получить. Для этого мы будем использовать функцию ВЫРАЗИТЬ (CAST) непосредственно в тексте запроса динамического списка.
Разберем по шагам, как изменить запрос. Допустим, ваш исходный код в динамическом списке выглядел так:
ВЫБРАТЬ
СправочникПартнеры.Ссылка КАК Ссылка,
СправочникПартнеры.Наименование КАК Наименование,
ЕСТЬNULL(СправочникКонтрагенты.ИНН, "") КАК ИНН
ИЗ
Справочник.Партнеры КАК СправочникПартнеры
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК СправочникКонтрагенты
ПО СправочникПартнеры.ОсновнойКонтрагент = СправочникКонтрагенты.Ссылка
Для исправления ошибки нам необходимо обернуть поле ИНН в функцию ВЫРАЗИТЬ. Проанализируем обновленный фрагмент кода:
ВЫБРАТЬ
СправочникПартнеры.Ссылка КАК Ссылка,
// ... другие поля ...
ВЫРАЗИТЬ(ЕСТЬNULL(СправочникКонтрагенты.ИНН, "") КАК СТРОКА(12)) КАК ИНН
ИЗ
Справочник.Партнеры КАК СправочникПартнеры
Важный момент: если ваша база предполагает работу с иностранными контрагентами, длина ИНН может быть больше 12 символов. В таком случае рекомендуется использовать СТРОКА(20). Это гарантирует, что платформа выделит достаточное место в памяти под любые данные в этой колонке.
Если вы не хотите менять текст запроса или используете основную таблицу без произвольного запроса, мы можем воспользоваться визуальными средствами настройки в конфигураторе. Посмотрим на пример настройки свойств динамического списка:
Список и откройте его свойства.ИНН. Обратите внимание на колонку Тип.Строка, указав длину 12 или 20.Такой подход заставляет интерфейс формы игнорировать динамические догадки платформы и всегда отрисовывать поле заданной длины.
Проанализируем ситуацию, когда код кажется верным, но проблема остается. В современных конфигурациях 1С активно используются расширения. Если в каком-либо расширении переопределяется запрос этого же списка, ваше исправление в основной конфигурации может не сработать.
Рассмотрим, что нужно проверить:
Партнеры. Ищите там изменения в форме списка.В некоторых случаях, даже после исправления кода, пользователь продолжает видеть «огрызок» ИНН. Это происходит из-за того, что платформа сохранила визуальные параметры колонки (ширину и формат) в кэше. Рассмотрим, как выполнить полную очистку:
После этого при следующем открытии формы платформа заново инициализирует динамический список, считав уже исправленные нами типы данных из запроса.
Подводя итог, можно сказать, что проблема «первого символа» — это типичный пример того, как автоматизация платформы 1С может работать против разработчика. Использование функции ВЫРАЗИТЬ в запросах динамических списков — это лучшая практика (Best Practice), которая позволяет избежать подобных интерфейсных багов и сделать работу пользователя комфортной.