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