Как в 1С 7.7 отобрать доверенности по поставщику при выборе в документе поступления?

Программист 1С v7.7 Бухгалтерский учет IT и автоматизация бизнеса
← На главную

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

Попытка вызвать метод УстановитьОтбор() прямо в модуле формы документа поступления приводит к ошибке «{Документ.ПоступлениеМатериалов.Форма.Модуль}: Процедура не обнаружена (УстановитьОтбор)».

Выясним причину этой ошибки и разберем по шагам несколько рабочих способов фильтрации доверенностей по поставщику в среде 1С 7.7.

Почему возникает ошибка «Процедура не обнаружена (УстановитьОтбор)»

Проанализируем контекст выполнения методов в платформе 1С 7.7. Метод УстановитьОтбор() является контекстным методом модуля формы журнала документов. В модулях форм документов, отчетов и обработок эта процедура отсутствует.

Кроме того, стандартный метод УстановитьОтбор(ИмяГрафы, Значение) в журнале документов может фильтровать данные только по предварительно созданной в конфигураторе Графе отбора либо по конкретному виду документа. Наложить динамический сложный фильтр напрямую на стандартный диалог выбора без дополнительной настройки невозможно.

Способ 1. Быстрый выбор через СписокЗначений в процедуре ПриНачалеВыбораЗначения

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

Разберем реализацию в модуле формы документа поступления:


Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандартнойОбработки)
    Если ИдентЭлемДиалога = "Доверенность" Тогда
        Если ПустоеЗначение(Контрагент) = 1 Тогда
            Предупреждение("Сначала укажите поставщика!");
            ФлагСтандартнойОбработки = 0;
            Возврат;
        КонецЕсли;

        // Отключаем стандартный диалог выбора
        ФлагСтандартнойОбработки = 0;

        СписокДоверенностей = СоздатьОбъект("СписокЗначений");
        ДокДоверенность = СоздатьОбъект("Документ.Доверенность");

        // Выбираем документы за нужный период (например, за последний квартал)
        ДокДоверенность.ВыбратьДокументы(ТекущаяДата() - 90, ТекущаяДата());
        Пока ДокДоверенность.ПолучитьДокумент() = 1 Цикл
            Если ДокДоверенность.Контрагент = Контрагент Тогда
                Представление = "№ " + СокрЛП(ДокДоверенность.НомерДок) + " от " + ДокДоверенность.ДатаДок + " (" + СокрЛП(ДокДоверенность.ФизЛицо) + ")";
                СписокДоверенностей.ДобавитьЗначение(ДокДоверенность.ТекущийДокумент(), Представление);
            КонецЕсли;
        КонецЦикла;

        Если СписокДоверенностей.РазмерСписка() = 0 Тогда
            Предупреждение("Для выбранного поставщика не найдено действующих доверенностей!");
            Возврат;
        КонецЕсли;

        ВыбранныйДок = "";
        Если СписокДоверенностей.ВыбратьЗначение(ВыбранныйДок, "Выберите доверенность:") = 1 Тогда
            Доверенность = ВыбранныйДок;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Способ 2. Использование журнала документов и Графы отбора

Если документов много и пользователю нужен полноценный журнал с поиском и сортировкой по колонкам, настроим отбор через стандартный журнал документов. Разберем по шагам, как это сделать:

  1. В дереве конфигурации перейдем в ветку Графы отбора и создадим новую графу с идентификатором Контрагент.
  2. В составе графы отбора отметим реквизит Контрагент документа Доверенность (и других документов при необходимости).
  3. Создадим специализированный журнал (или используем существующий журнал доверенностей) и откроем модуль его формы.
  4. В модуле формы журнала пропишем обработку параметра открытия:

Процедура ПриОткрытии()
    Если ПустоеЗначение(Форма.Параметр) = 0 Тогда
        // Устанавливаем фильтр по созданной графе отбора
        УстановитьОтбор("Контрагент", Форма.Параметр);
    КонецЕсли;
КонецПроцедуры

Процедура ПриВыбореСтроки()
    Если Форма.ВРежимеВыбора() = 1 Тогда
        Форма.Параметр = ТекущийДокумент;
        Форма.Закрыть();
    КонецЕсли;
КонецПроцедуры

Теперь в модуле формы документа ПоступлениеМатериалов в процедуре ПриНачалеВыбораЗначения вызываем модальное открытие журнала с передачей контрагента:


Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандартнойОбработки)
    Если ИдентЭлемДиалога = "Доверенность" Тогда
        Если ПустоеЗначение(Контрагент) = 1 Тогда
            Предупреждение("Сначала выберите поставщика!");
            ФлагСтандартнойОбработки = 0;
            Возврат;
        КонецЕсли;

        ФлагСтандартнойОбработки = 0;
        ВыбранныйДокумент = Контрагент;
        
        ОткрытьФормуМодально("Журнал.Доверенности", ВыбранныйДокумент);
        
        Если ПустоеЗначение(ВыбранныйДокумент) = 0 Тогда
            Доверенность = ВыбранныйДокумент;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Способ 3. Универсальная форма подбора на базе ТаблицыЗначений

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

Посмотрим на пример заполнения таблицы через объект Запрос при открытии формы обработки:


Процедура ПриОткрытии()
    Поставщик = Форма.Параметр;
    
    ТЗ.Очистить();
    ТЗ.НоваяКолонка("Документ", "Документ.Доверенность");
    ТЗ.НоваяКолонка("Номер", "Строка");
    ТЗ.НоваяКолонка("Дата", "Дата");
    ТЗ.НоваяКолонка("ФизЛицо", "Справочник.Сотрудники");

    ТекстЗапроса = "
    |Период с (ТекущаяДата() - 60) по (ТекущаяДата());
    |ТекДок = Документ.Доверенность.ТекущийДокумент;
    |Поставщик = Документ.Доверенность.Контрагент;
    |Условие (Поставщик = ВыбПоставщик);
    |Группировка ТекДок;
    |";
    
    Запрос = СоздатьОбъект("Запрос");
    Запрос.Константа("ВыбПоставщик", Поставщик);
    
    Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
        Пока Запрос.Группировка("ТекДок") = 1 Цикл
            Док = Запрос.ТекДок;
            ТЗ.НоваяСтрока();
            ТЗ.Документ = Док;
            ТЗ.Номер = Док.НомерДок;
            ТЗ.Дата = Док.ДатаДок;
            ТЗ.ФизЛицо = Док.ФизЛицо;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры

Процедура ПоВыборуСтрокиТЗ()
    Если ТЗ.ТекущаяСтрока() > 0 Тогда
        Форма.Параметр = ТЗ.ПолучитьЗначение(ТЗ.ТекущаяСтрока(), "Документ");
        Форма.Закрыть();
    КонецЕсли;
КонецПроцедуры

Каждый из описанных методов решает проблему фильтрации доверенностей: для простых задач достаточно использования СписокЗначений, а для сложной бизнес-логики и работы с большими объемами данных оптимально подходит вариант с формой подбора на базе ТаблицаЗначений или настроенная графа отбора журнала.

← На главную