Почему в 1С:Управление торговлей 11 не выводится колонка ИНН в списке контрагентов и как это исправить

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет
← На главную

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

Анализируем архитектуру справочников: Партнеры и Контрагенты

Для начала разберем внутреннюю логику системы. В конфигурации УТ 11 разделены понятия управленческого учета (Партнеры) и регламентированного учета (Контрагенты). Если в настройках системы отключена опция независимого ведения партнеров и контрагентов, программа старается поддерживать связь «один к одному». В этом случае реквизиты ИНН и КПП визуально отображаются прямо в карточке партнера, хотя физически они хранятся в связанном элементе справочника Контрагенты.

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


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

Рассмотрим ситуацию, когда логика «один к одному» нарушается. Если в базе данных по какой-то причине (например, после некорректного импорта данных или сбоя при записи) одному партнеру соответствует два и более контрагента, левое соединение в запросе выдаст две строки для одного и того же партнера. Чтобы не загромождать список дублями и не вводить пользователя в заблуждение, разработчики 1С заложили в типовые алгоритмы механизм автоматического скрытия колонок ИНН и КПП.

Выясняем причину программного скрытия колонок

Проанализируем поведение формы в режиме отладки. Часто можно заметить, что в процедуре ПриСозданииНаСервере элементы формы ИНН и КПП еще присутствуют и имеют свойство Видмость = Истина, но уже в процедуре ПриОткрытии или после полной инициализации формы они исчезают из состава элементов. Это происходит потому, что система выполняет проверку целостности данных.

Основная логика скрытия обычно сосредоточена в общем модуле ПартнерыИКонтрагентыКлиентСервер или непосредственно в коде формы списка (например, ФормаСпискаБезПолнотекстовогоПоиска). Система проверяет: если существует хотя бы один партнер, у которого более одного контрагента, колонки ИНН/КПП считаются «неопределенными» для всего списка и программно удаляются или скрываются.

Шаг 1: Поиск дублей контрагентов

Первым делом нам необходимо выяснить, есть ли в базе данных «проблемные» записи. Для этого воспользуемся консолью запросов или создадим небольшую обработку. Нам нужно сгруппировать контрагентов по полю Партнер и отобрать тех, где количество записей больше одной. Рассмотрим следующий текст запроса:


ВЫБРАТЬ
    Контрагенты.Партнер КАК Партнер,
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) КАК КоличествоКонтрагентов
ПОМЕСТИТЬ ВТ_Дубли
ИЗ
    Справочник.Контрагенты КАК Контрагенты
ГДЕ
    Контрагенты.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
СГРУППИРОВАТЬ ПО
    Контрагенты.Партнер
ИМЕЮЩИЕ
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) > 1
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ_Дубли.Партнер КАК Партнер,
    Контрагенты.Ссылка КАК Контрагент,
    Контрагенты.ИНН КАК ИНН,
    Контрагенты.Наименование КАК НаименованиеКонтрагента
ИЗ
    ВТ_Дубли КАК ВТ_Дубли
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
        ПО ВТ_Дубли.Партнер = Контрагенты.Партнер
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
    ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка),
    Контрагенты.Ссылка,
    Контрагенты.ИНН,
    Контрагенты.Наименование
ИЗ
    Справочник.Контрагенты КАК Контрагенты
ГДЕ
    Контрагенты.Партнер = ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)

Важный момент: также стоит проверить контрагентов, у которых поле Партнер вообще не заполнено (пустая ссылка). Они также могут влиять на логику работы интерфейса в определенных режимах.

Шаг 2: Очистка и санация данных

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

  1. Анализ дублей: Проверьте, являются ли эти контрагенты действительно дублями или это разные юридические лица одного холдинга.
  2. Объединение: Если это дубли, воспользуйтесь стандартной обработкой «Поиск и удаление дублей» (раздел «Администрирование» — «Обслуживание»). Выберите справочник Контрагенты, укажите в качестве правила поиска совпадение по полю Партнер.
  3. Ручная корректировка: Если дублей немного, можно вручную зайти в карточку лишнего контрагента и либо пометить его на удаление, либо перепривязать к правильному партнеру, либо вовсе удалить связь, если она ошибочна.

Как только в системе будет соблюдено строгое правило «Один партнер — Один контрагент», типовые механизмы УТ 11 при следующем открытии формы списка автоматически вернут колонки ИНН и КПП в доступные поля.

Шаг 3: Программное решение через расширение (если чистка невозможна)

Бывают ситуации, когда бизнес-логика требует наличия нескольких контрагентов у одного партнера, но ИНН видеть в списке всё равно нужно (например, ИНН основного контрагента). В этом случае нам придется прибегнуть к разработке расширения. Нам нужно вмешаться в процесс инициализации формы списка партнеров.

Рассмотрим пример кода в расширении для формы списка:


&НаСервере
Процедура Расш_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
    // Принудительно включаем видимость, если система её погасила
    Если Элементы.Найти("ИНН") <> Неопределено Тогда
        Элементы.ИНН.Видимость = Истина;
        Элементы.ИНН.Доступность = Истина;
    КонецЕсли;
    
    Если Элементы.Найти("КПП") <> Неопределено Тогда
        Элементы.КПП.Видимость = Истина;
        Элементы.КПП.Доступность = Истина;
    КонецЕсли;
КонецПроцедуры

Однако помните, что при наличии дублей в колонке ИНН будет отображаться значение только одного из контрагентов (обычно того, который первым попал в выборку запроса), что может привести к путанице. Поэтому санация данных всегда является предпочтительным вариантом.

Дополнительный способ: Использование дополнительных реквизитов

Если вы не хотите вносить изменения в код и не можете гарантировать отсутствие дублей контрагентов, можно пойти по пути «малой крови», используя механизм дополнительных реквизитов:

  1. Создайте дополнительный реквизит для справочника Партнеры с типом «Строка» и назовите его «ИНН для списка».
  2. Заполните этот реквизит у партнеров (это можно сделать групповой обработкой, скопировав данные из справочника контрагентов).
  3. Выведите этот дополнительный реквизит в форму списка через «Еще» — «Изменить форму».

Этот способ гарантирует, что колонка никогда не исчезнет, так как она не привязана к сложной логике соединения таблиц Партнеры и Контрагенты. Но он требует поддержания актуальности данных в двух местах одновременно, что можно автоматизировать простым кодом в модуле объекта партнера при записи.

Резюме

Проанализировав ситуацию, мы выяснили, что отсутствие колонки ИНН в УТ 11 — это не ошибка программы, а следствие работы защитного алгоритма против дублирования строк в динамических списках. Основным и самым правильным решением является удаление дублей контрагентов, привязанных к одному партнеру. После наведения порядка в нормативно-справочной информации штатный функционал системы восстанавливается без участия программиста.

← На главную