При работе с программными продуктами на базе 1С:Предприятие 8.3, такими как Управление торговлей 11, ERP Управление предприятием 2 или Комплексная автоматизация 2, пользователи часто сталкиваются со странным поведением системы: в форме списка справочника Партнеры невозможно вывести колонку ИНН или КПП через стандартную настройку «Изменить форму». Даже если флажок «Независимо вести партнеров и контрагентов» в настройках программы снят, эти реквизиты могут отсутствовать в списке доступных полей или самопроизвольно скрываться. В этой статье мы подробно разберем, почему это происходит и как решить проблему программным и административным путем.
Для начала разберем внутреннюю логику системы. В конфигурации УТ 11 разделены понятия управленческого учета (Партнеры) и регламентированного учета (Контрагенты). Если в настройках системы отключена опция независимого ведения партнеров и контрагентов, программа старается поддерживать связь «один к одному». В этом случае реквизиты ИНН и КПП визуально отображаются прямо в карточке партнера, хотя физически они хранятся в связанном элементе справочника Контрагенты.
Проблема с колонками в списке возникает из-за того, что динамический список формы списка партнеров использует соединение этих двух таблиц. Проанализируем типичный запрос, который система использует для вывода данных:
ВЫБРАТЬ
СправочникПартнеры.Ссылка КАК Ссылка,
СправочникПартнеры.Наименование КАК Наименование,
Контрагенты.ИНН КАК ИНН,
Контрагенты.КПП КАК КПП
ИЗ
Справочник.Партнеры КАК СправочникПартнеры
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО Контрагенты.Партнер = СправочникПартнеры.Ссылка
ГДЕ
НЕ СправочникПартнеры.ПометкаУдаления
Рассмотрим ситуацию, когда логика «один к одному» нарушается. Если в базе данных по какой-то причине (например, после некорректного импорта данных или сбоя при записи) одному партнеру соответствует два и более контрагента, левое соединение в запросе выдаст две строки для одного и того же партнера. Чтобы не загромождать список дублями и не вводить пользователя в заблуждение, разработчики 1С заложили в типовые алгоритмы механизм автоматического скрытия колонок ИНН и КПП.
Проанализируем поведение формы в режиме отладки. Часто можно заметить, что в процедуре ПриСозданииНаСервере элементы формы ИНН и КПП еще присутствуют и имеют свойство Видмость = Истина, но уже в процедуре ПриОткрытии или после полной инициализации формы они исчезают из состава элементов. Это происходит потому, что система выполняет проверку целостности данных.
Основная логика скрытия обычно сосредоточена в общем модуле ПартнерыИКонтрагентыКлиентСервер или непосредственно в коде формы списка (например, ФормаСпискаБезПолнотекстовогоПоиска). Система проверяет: если существует хотя бы один партнер, у которого более одного контрагента, колонки ИНН/КПП считаются «неопределенными» для всего списка и программно удаляются или скрываются.
Первым делом нам необходимо выяснить, есть ли в базе данных «проблемные» записи. Для этого воспользуемся консолью запросов или создадим небольшую обработку. Нам нужно сгруппировать контрагентов по полю Партнер и отобрать тех, где количество записей больше одной. Рассмотрим следующий текст запроса:
ВЫБРАТЬ
Контрагенты.Партнер КАК Партнер,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) КАК КоличествоКонтрагентов
ПОМЕСТИТЬ ВТ_Дубли
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Партнер <> ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
СГРУППИРОВАТЬ ПО
Контрагенты.Партнер
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) > 1
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ_Дубли.Партнер КАК Партнер,
Контрагенты.Ссылка КАК Контрагент,
Контрагенты.ИНН КАК ИНН,
Контрагенты.Наименование КАК НаименованиеКонтрагента
ИЗ
ВТ_Дубли КАК ВТ_Дубли
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
ПО ВТ_Дубли.Партнер = Контрагенты.Партнер
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка),
Контрагенты.Ссылка,
Контрагенты.ИНН,
Контрагенты.Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.Партнер = ЗНАЧЕНИЕ(Справочник.Партнеры.ПустаяСсылка)
Важный момент: также стоит проверить контрагентов, у которых поле Партнер вообще не заполнено (пустая ссылка). Они также могут влиять на логику работы интерфейса в определенных режимах.
После того как мы получили список партнеров с дублями контрагентов, необходимо привести данные в порядок. Рассмотрим алгоритм действий:
Контрагенты, укажите в качестве правила поиска совпадение по полю Партнер.Как только в системе будет соблюдено строгое правило «Один партнер — Один контрагент», типовые механизмы УТ 11 при следующем открытии формы списка автоматически вернут колонки ИНН и КПП в доступные поля.
Бывают ситуации, когда бизнес-логика требует наличия нескольких контрагентов у одного партнера, но ИНН видеть в списке всё равно нужно (например, ИНН основного контрагента). В этом случае нам придется прибегнуть к разработке расширения. Нам нужно вмешаться в процесс инициализации формы списка партнеров.
Рассмотрим пример кода в расширении для формы списка:
&НаСервере
Процедура Расш_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Принудительно включаем видимость, если система её погасила
Если Элементы.Найти("ИНН") <> Неопределено Тогда
Элементы.ИНН.Видимость = Истина;
Элементы.ИНН.Доступность = Истина;
КонецЕсли;
Если Элементы.Найти("КПП") <> Неопределено Тогда
Элементы.КПП.Видимость = Истина;
Элементы.КПП.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
Однако помните, что при наличии дублей в колонке ИНН будет отображаться значение только одного из контрагентов (обычно того, который первым попал в выборку запроса), что может привести к путанице. Поэтому санация данных всегда является предпочтительным вариантом.
Если вы не хотите вносить изменения в код и не можете гарантировать отсутствие дублей контрагентов, можно пойти по пути «малой крови», используя механизм дополнительных реквизитов:
Партнеры с типом «Строка» и назовите его «ИНН для списка».Этот способ гарантирует, что колонка никогда не исчезнет, так как она не привязана к сложной логике соединения таблиц Партнеры и Контрагенты. Но он требует поддержания актуальности данных в двух местах одновременно, что можно автоматизировать простым кодом в модуле объекта партнера при записи.
Проанализировав ситуацию, мы выяснили, что отсутствие колонки ИНН в УТ 11 — это не ошибка программы, а следствие работы защитного алгоритма против дублирования строк в динамических списках. Основным и самым правильным решением является удаление дублей контрагентов, привязанных к одному партнеру. После наведения порядка в нормативно-справочной информации штатный функционал системы восстанавливается без участия программиста.