Почему в колонке ИНН отображается только один символ и как это исправить?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием IT и автоматизация бизнеса
← На главную

В процессе работы с конфигурациями на базе 1С:Предприятие 8.3 (такими как 1С:ERP, УТ 11 или КА 2) программисты часто сталкиваются с загадочным поведением динамических списков. Одной из наиболее раздражающих проблем является ситуация, когда в колонке ИНН справочника Партнеры внезапно начинает отображаться только первый символ номера. При этом, если мы обратимся к данным программно через Элементы.Список.CurrentData, мы увидим полную строку, но визуально в таблице и в окне отборов доступен лишь один знак.

В этой статье мы подробно разберем, почему так происходит, проанализируем внутренние механизмы платформы и рассмотрим пошаговые инструкции по устранению данной ошибки.

Выясним причину: почему платформа «обрезает» данные

Для начала проанализируем ситуацию. Динамический список — это сложный объект, который не просто выполняет запрос к базе данных, но и пытается оптимизировать отображение. Основная причина нашей проблемы кроется в механизме автоматического определения типов.

Когда динамический список инициализируется, платформа анализирует результат запроса, чтобы выделить память под колонки и определить их формат. Если в тексте запроса используется ЛЕВОЕ СОЕДИНЕНИЕ (Left Join) с таблицей контрагентов (что типично для справочника Партнеры), и в первых нескольких записях выборки поле ИНН оказывается пустым (NULL) или содержит пустую строку, платформа может ошибочно интерпретировать это поле как Строка(1).

Рассмотрим подробнее факторы, влияющие на это поведение:

  1. Особенности платформы 8.3.20 и выше: В новых версиях оптимизатор запросов стал более агрессивным. Если он видит конструкцию типа "" КАК ИНН или ЕСТЬNULL(Таблица.ИНН, ""), он может назначить минимальную длину строки для всей колонки.
  2. Связь Партнер-Контрагент: В 1С:ERP справочники Партнеры и Контрагенты разделены. Если у партнера не указан основной контрагент, запрос возвращает NULL. Именно этот NULL часто сбивает платформу с толку при определении длины поля.
  3. Кэширование настроек: Иногда проблема сохраняется даже после правки кода из-за того, что настройки ширины и формата колонки «застряли» в хранилище общих настроек пользователя.

Решение 1: Принудительная типизация в тексте запроса

Самый надежный и правильный метод — это явно указать платформе, какую длину строки мы ожидаем получить. Для этого мы будем использовать функцию ВЫРАЗИТЬ (CAST) непосредственно в тексте запроса динамического списка.

Разберем по шагам, как изменить запрос. Допустим, ваш исходный код в динамическом списке выглядел так:


ВЫБРАТЬ
    СправочникПартнеры.Ссылка КАК Ссылка,
    СправочникПартнеры.Наименование КАК Наименование,
    ЕСТЬNULL(СправочникКонтрагенты.ИНН, "") КАК ИНН
ИЗ
    Справочник.Партнеры КАК СправочникПартнеры
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК СправочникКонтрагенты
    ПО СправочникПартнеры.ОсновнойКонтрагент = СправочникКонтрагенты.Ссылка

Для исправления ошибки нам необходимо обернуть поле ИНН в функцию ВЫРАЗИТЬ. Проанализируем обновленный фрагмент кода:


ВЫБРАТЬ
    СправочникПартнеры.Ссылка КАК Ссылка,
    // ... другие поля ...
    ВЫРАЗИТЬ(ЕСТЬNULL(СправочникКонтрагенты.ИНН, "") КАК СТРОКА(12)) КАК ИНН
ИЗ
    Справочник.Партнеры КАК СправочникПартнеры

Важный момент: если ваша база предполагает работу с иностранными контрагентами, длина ИНН может быть больше 12 символов. В таком случае рекомендуется использовать СТРОКА(20). Это гарантирует, что платформа выделит достаточное место в памяти под любые данные в этой колонке.

Решение 2: Настройка свойств поля в Конфигураторе

Если вы не хотите менять текст запроса или используете основную таблицу без произвольного запроса, мы можем воспользоваться визуальными средствами настройки в конфигураторе. Посмотрим на пример настройки свойств динамического списка:

  1. Откройте форму списка справочника в Конфигураторе.
  2. Выберите элемент Список и откройте его свойства.
  3. Нажмите на ссылку «Настройка списка» и перейдите на закладку Поля.
  4. Найдите поле ИНН. Обратите внимание на колонку Тип.
  5. Снимите флажок «Авто» (если он установлен) и вручную выберите тип Строка, указав длину 12 или 20.

Такой подход заставляет интерфейс формы игнорировать динамические догадки платформы и всегда отрисовывать поле заданной длины.

Решение 3: Проверка функциональных опций и расширений

Проанализируем ситуацию, когда код кажется верным, но проблема остается. В современных конфигурациях 1С активно используются расширения. Если в каком-либо расширении переопределяется запрос этого же списка, ваше исправление в основной конфигурации может не сработать.

Рассмотрим, что нужно проверить:

Решение 4: Очистка пользовательских настроек

В некоторых случаях, даже после исправления кода, пользователь продолжает видеть «огрызок» ИНН. Это происходит из-за того, что платформа сохранила визуальные параметры колонки (ширину и формат) в кэше. Рассмотрим, как выполнить полную очистку:

  1. Зайдите в программу под учетной записью администратора.
  2. Перейдите в раздел Администрирование — Настройки пользователей и прав.
  3. Выберите пункт Очистка настроек.
  4. Найдите нужного пользователя и конкретную форму списка партнеров.
  5. Удалите все настройки для этой формы.

После этого при следующем открытии формы платформа заново инициализирует динамический список, считав уже исправленные нами типы данных из запроса.

Подводя итог, можно сказать, что проблема «первого символа» — это типичный пример того, как автоматизация платформы 1С может работать против разработчика. Использование функции ВЫРАЗИТЬ в запросах динамических списков — это лучшая практика (Best Practice), которая позволяет избежать подобных интерфейсных багов и сделать работу пользователя комфортной.

← На главную