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

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

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

Разберем подробно, почему так происходит, как устроена логика системы и каким образом мы можем решить эту задачу, соблюдая стандарты разработки.

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

Прежде чем переходить к коду, проанализируем саму концепцию справочников. В современных управленческих решениях 1С разделены сущности Партнер (управленческое понятие, холдинг, бренд) и Контрагент (юридическое лицо). У одного партнера может быть несколько контрагентов. Поскольку ИНН — это атрибут юридического лица (контрагента), система по умолчанию не «знает», какой именно ИНН показывать в списке партнеров, если их там несколько. Именно поэтому в типовом динамическом списке формы ФормаСпискаБезПолнотекстовогоПоиска вывод данных контрагентов ограничен программно.

Выясняем причину скрытия реквизита

Рассмотрим ситуацию: в конфигураторе мы видим, что в запросе динамического списка Список присутствует левое соединение со справочником Контрагенты и выбрано поле Контрагенты.ИНН. На форме также добавлен элемент ИНН с путем к данным Список.ИНН. Но в пользовательском режиме поле исчезает.

Проанализируем поведение системы через отладчик. Выясняется, что при открытии формы текст запроса динамического списка полностью переформировывается. Основная логика сосредоточена в общем модуле ПартнерыИКонтрагенты. Рассмотрим фрагмент кода, который управляет этим процессом:


// Фрагмент типичного кода в модуле формы или общем модуле
ЗапросСИнформациейПоКонтрагенту = Ложь; 
Форма.Список.ТекстЗапроса = ПартнерыИКонтрагенты.ТекстЗапросаДинамическогоСпискаПартнеры(ЗапросСИнформациейПоКонтрагенту);

Обратите внимание на переменную ЗапросСИнформациейПоКонтрагенту. В стандартном вызове для формы списка партнеров она жестко установлена в значение Ложь. В результате функция формирования текста запроса просто вырезает блок выбора полей ИНН, КПП и других реквизитов контрагента из итогового SQL-запроса к базе данных. Это делается разработчиками 1С для оптимизации производительности: лишние соединения и поля замедляют работу списка при большом количестве записей.

Способ решения №1: Использование расширения конфигурации

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

Рассмотрим по шагам, как это реализовать:

  1. Создайте новое расширение в базе данных.
  2. Найдите форму списка справочника Партнеры (например, ФормаСпискаБезПолнотекстовогоПоиска) и добавьте её в расширение.
  3. Найдите процедуру ПриСозданииНаСервере или ту процедуру, где вызывается установка текста запроса. Обычно это вызов метода общего модуля.
  4. Используйте аннотацию &После или &Вместо для изменения логики.

Пример кода в расширении для процедуры ПриСозданииНаСервере:


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

Способ решения №2: Настройка функциональных опций

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

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

Важные замечания по производительности и логике

Рассмотрим последствия, которые могут возникнуть после принудительного включения ИНН в список:

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

Таким образом, мы проанализировали ситуацию и выяснили, что "невидимость" реквизита обусловлена не ошибкой в конфигураторе, а осознанным программным ограничением типового решения. Используя расширение и передачу верного значения флага в функции общих модулей, мы можем вернуть необходимую функциональность пользователям.

← На главную