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