Как напечатать справочник контрагентов в 1С:Предприятие 7.7 с отбором по группам?

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

При работе в конфигурации «Торговля и Склад 7.7» нередко возникает необходимость распечатать реестр контрагентов с нестандартными условиями отбора: включить в список несколько определенных папок и одновременно исключить некоторые вложенные группы. Стандартный универсальный отчет печати справочников (RefPrint) не всегда позволяет гибко настроить множественные условия по иерархии, а также не выводит специфические реквизиты вроде ИНН и юридического адреса без доработки. Рассмотрим подробно, почему возникают эти ограничения и какими способами можно решить задачу.

Особенности иерархических отборов и структуры данных в 1С 7.7

Проанализируем две ключевые технические особенности платформы 1С 7.7 и конфигурации «Торговля и Склад»:

  1. Поведение условий в запросах по иерархии: если в тексте запроса используется условие вида Условие (Контрагент В СписокГрупп), платформа автоматически включает в выборку саму группу, все её подгруппы и элементы на любую глубину вложенности. Чтобы ограничить выборку конкретным родителем без его потомков, условие накладывается строго на реквизит Родитель: Условие (Контрагент.Родитель В СписокРодителей).
  2. Хранение реквизитов контрагента в ТиС 7.7: данные юридических и физических лиц (ИНН, КПП, телефоны, фактический и юридический адреса) не хранятся в простых строковых реквизитах справочника Контрагенты. Они вынесены в подчиненные структуры через реквизит ЮрФизЛицо (справочники СведенияОЮрФизЛице, ЮрЛица, ФизЛица). Из-за этого универсальные отчеты выводят лишь базовые данные, требуя вызова специальных функций глобального модуля для получения контактной информации.

Способ 1. Использование типовой «Универсальной обработки подбора объектов» с множественным фильтром

Разберем вариант решения задачи без написания нового отчета с нуля. В составе типовых конфигураций присутствует инструмент подбора объектов, поддерживающий множественные фильтры (МФ).

  1. Откроем обработку «Универсальная обработка подбора объектов» или «Групповая обработка контрагентов».
  2. В таблице условий настроим множественный фильтр по полю Родитель. Для отбора конкретных папок добавим строки с типами условий «В списке» и «Не в списке».
  3. Для вывода на печать подключим внешний алгоритм (печать отобранных строк) к кнопке выполнения действий, что позволит сформировать печатную форму по уже отфильтрованному списку элементов.

Способ 2. Программный обход справочника с проверкой вложенности

Рассмотрим создание собственной специализированной обработки. Для реализации точного отбора создадим на форме два списка значений типа СписокЗначений: СписокВключаемыхГрупп и СписокИсключаемыхГрупп.

При обходе справочника используем метод ПринадлежитЭлементу(), который проверяет вхождение элемента или группы в родительскую ветку с учетом всей глубины иерархии:


Перем Спр, Таб;

Спр = СоздатьОбъект("Справочник.Контрагенты");
Таб = СоздатьОбъект("Таблица");

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

Способ 3. Получение расширенных реквизитов (ИНН, адрес, телефоны)

Выясним, как правильно выводить реквизиты юридического лица в печатную форму конфигурации «Торговля и Склад 7.7». Вместо прямого чтения реквизитов справочника вызовем экспортные функции глобального модуля конфигурации:


// Получение ИНН контрагента с учетом типа ЮрФизЛица
ИНН_КПП = глПолучитьРеквизитШапки(Спр.ТекущийЭлемент(), "ИНН");

// Получение юридического адреса контрагента
ЮрАдрес = глПолучитьАдрес(Спр.ТекущийЭлемент(), 1);

// Получение фактического адреса контрагента
ФактАдрес = глПолучитьАдрес(Спр.ТекущийЭлемент(), 2);

Использование функций глПолучитьРеквизитШапки() и глПолучитьАдрес() гарантирует корректное извлечение информации вне зависимости от того, является контрагент юридическим лицом, физическим лицом или индивидуальным предпринимателем.

Сортировка данных через Таблицу Значений

Если перед выводом на печать список контрагентов необходимо отсортировать по иерархии, полному коду или наименованию, загрузим отобранные элементы в объект ТаблицаЗначений:

  1. Создаем объект ТЗ = СоздатьОбъект("ТаблицаЗначений") и описываем колонки через НоваяКолонка().
  2. В цикле проверки условий заполняем строки таблицы значений.
  3. Применяем метод ТЗ.Сортировать("Наименование+") или ТЗ.Сортировать("Код+").
  4. Построчно обходим ТаблицаЗначений и формируем итоговый макет Таблица.
← На главную