При оформлении документа поступления часто возникает задача связать его с ранее выписанной доверенностью. Пользователю неудобно просматривать общий список всех доверенностей организации, поэтому требуется отображать только документы, выписанные на указанного в текущем поступлении поставщика.
Попытка вызвать метод УстановитьОтбор() прямо в модуле формы документа поступления приводит к ошибке «{Документ.ПоступлениеМатериалов.Форма.Модуль}: Процедура не обнаружена (УстановитьОтбор)».
Выясним причину этой ошибки и разберем по шагам несколько рабочих способов фильтрации доверенностей по поставщику в среде 1С 7.7.
Проанализируем контекст выполнения методов в платформе 1С 7.7. Метод УстановитьОтбор() является контекстным методом модуля формы журнала документов. В модулях форм документов, отчетов и обработок эта процедура отсутствует.
Кроме того, стандартный метод УстановитьОтбор(ИмяГрафы, Значение) в журнале документов может фильтровать данные только по предварительно созданной в конфигураторе Графе отбора либо по конкретному виду документа. Наложить динамический сложный фильтр напрямую на стандартный диалог выбора без дополнительной настройки невозможно.
Рассмотрим наиболее простой программный вариант, не требующий создания дополнительных журналов и изменения структуры метаданных конфигурации. Мы перехватываем интерактивный выбор реквизита в форме документа поступления, делаем выборку доверенностей по нужному контрагенту и выводим пользователю компактный список для выбора.
Разберем реализацию в модуле формы документа поступления:
Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандартнойОбработки)
Если ИдентЭлемДиалога = "Доверенность" Тогда
Если ПустоеЗначение(Контрагент) = 1 Тогда
Предупреждение("Сначала укажите поставщика!");
ФлагСтандартнойОбработки = 0;
Возврат;
КонецЕсли;
// Отключаем стандартный диалог выбора
ФлагСтандартнойОбработки = 0;
СписокДоверенностей = СоздатьОбъект("СписокЗначений");
ДокДоверенность = СоздатьОбъект("Документ.Доверенность");
// Выбираем документы за нужный период (например, за последний квартал)
ДокДоверенность.ВыбратьДокументы(ТекущаяДата() - 90, ТекущаяДата());
Пока ДокДоверенность.ПолучитьДокумент() = 1 Цикл
Если ДокДоверенность.Контрагент = Контрагент Тогда
Представление = "№ " + СокрЛП(ДокДоверенность.НомерДок) + " от " + ДокДоверенность.ДатаДок + " (" + СокрЛП(ДокДоверенность.ФизЛицо) + ")";
СписокДоверенностей.ДобавитьЗначение(ДокДоверенность.ТекущийДокумент(), Представление);
КонецЕсли;
КонецЦикла;
Если СписокДоверенностей.РазмерСписка() = 0 Тогда
Предупреждение("Для выбранного поставщика не найдено действующих доверенностей!");
Возврат;
КонецЕсли;
ВыбранныйДок = "";
Если СписокДоверенностей.ВыбратьЗначение(ВыбранныйДок, "Выберите доверенность:") = 1 Тогда
Доверенность = ВыбранныйДок;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Если документов много и пользователю нужен полноценный журнал с поиском и сортировкой по колонкам, настроим отбор через стандартный журнал документов. Разберем по шагам, как это сделать:
Контрагент.Контрагент документа Доверенность (и других документов при необходимости).
Процедура ПриОткрытии()
Если ПустоеЗначение(Форма.Параметр) = 0 Тогда
// Устанавливаем фильтр по созданной графе отбора
УстановитьОтбор("Контрагент", Форма.Параметр);
КонецЕсли;
КонецПроцедуры
Процедура ПриВыбореСтроки()
Если Форма.ВРежимеВыбора() = 1 Тогда
Форма.Параметр = ТекущийДокумент;
Форма.Закрыть();
КонецЕсли;
КонецПроцедуры
Теперь в модуле формы документа ПоступлениеМатериалов в процедуре ПриНачалеВыбораЗначения вызываем модальное открытие журнала с передачей контрагента:
Процедура ПриНачалеВыбораЗначения(ИдентЭлемДиалога, ФлагСтандартнойОбработки)
Если ИдентЭлемДиалога = "Доверенность" Тогда
Если ПустоеЗначение(Контрагент) = 1 Тогда
Предупреждение("Сначала выберите поставщика!");
ФлагСтандартнойОбработки = 0;
Возврат;
КонецЕсли;
ФлагСтандартнойОбработки = 0;
ВыбранныйДокумент = Контрагент;
ОткрытьФормуМодально("Журнал.Доверенности", ВыбранныйДокумент);
Если ПустоеЗначение(ВыбранныйДокумент) = 0 Тогда
Доверенность = ВыбранныйДокумент;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Когда требуется наложить множественные условия (например, отобрать только незакрытые доверенности с неистекшим сроком действия по конкретному поставщику), создадим отдельную обработку подбора. На форму обработки поместим элемент диалога ТаблицаЗначений.
Посмотрим на пример заполнения таблицы через объект Запрос при открытии формы обработки:
Процедура ПриОткрытии()
Поставщик = Форма.Параметр;
ТЗ.Очистить();
ТЗ.НоваяКолонка("Документ", "Документ.Доверенность");
ТЗ.НоваяКолонка("Номер", "Строка");
ТЗ.НоваяКолонка("Дата", "Дата");
ТЗ.НоваяКолонка("ФизЛицо", "Справочник.Сотрудники");
ТекстЗапроса = "
|Период с (ТекущаяДата() - 60) по (ТекущаяДата());
|ТекДок = Документ.Доверенность.ТекущийДокумент;
|Поставщик = Документ.Доверенность.Контрагент;
|Условие (Поставщик = ВыбПоставщик);
|Группировка ТекДок;
|";
Запрос = СоздатьОбъект("Запрос");
Запрос.Константа("ВыбПоставщик", Поставщик);
Если Запрос.Выполнить(ТекстЗапроса) = 1 Тогда
Пока Запрос.Группировка("ТекДок") = 1 Цикл
Док = Запрос.ТекДок;
ТЗ.НоваяСтрока();
ТЗ.Документ = Док;
ТЗ.Номер = Док.НомерДок;
ТЗ.Дата = Док.ДатаДок;
ТЗ.ФизЛицо = Док.ФизЛицо;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Процедура ПоВыборуСтрокиТЗ()
Если ТЗ.ТекущаяСтрока() > 0 Тогда
Форма.Параметр = ТЗ.ПолучитьЗначение(ТЗ.ТекущаяСтрока(), "Документ");
Форма.Закрыть();
КонецЕсли;
КонецПроцедуры
Каждый из описанных методов решает проблему фильтрации доверенностей: для простых задач достаточно использования СписокЗначений, а для сложной бизнес-логики и работы с большими объемами данных оптимально подходит вариант с формой подбора на базе ТаблицаЗначений или настроенная графа отбора журнала.