Как программно настроить выбор документа-основания в счете-фактуре 1С:ERP

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Налоговый учет
← На главную

В типовых конфигурациях, таких как 1С:ERP 2.4/2.5 или Комплексная автоматизация, работа с документом Счет-фактура полученный часто вызывает вопросы у разработчиков в части кастомизации выбора документов-оснований. Стандартное поведение платформы при работе с реквизитами составного типа (например, ОпределяемыйТип.ОснованиеСчетФактураПолученный) подразумевает открытие нескольких диалоговых окон: сначала выбор типа документа, а затем выбор конкретного экземпляра документа. Рассмотрим, как упростить этот процесс, перехватить выбор и наложить собственные фильтры.

Почему отладчик не «видит» форму выбора типа?

Разберем ситуацию, когда при нажатии на кнопку выбора в поле документа-основания открывается окно со списком метаданных. Многие разработчики пытаются найти эту форму в дереве конфигурации, чтобы изменить её логику, но не находят. Это происходит потому, что данное окно является системным окном платформы. Оно генерируется динамически на основе описания типов реквизита. Перехватить его открытие через стандартные события «ПриОткрытии» невозможно, так как это не объект метаданных «Форма».

Перехват события начала выбора

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

  1. Найдите поле на форме документа (или во вспомогательной форме подбора оснований).
  2. Создайте на клиенте обработчик события НачалоВыбора.
  3. Установите параметр СтандартнаяОбработка = Ложь. Это критически важно, так как именно эта строка «отключает» то самое системное окно платформы.

Рассмотрим пример кода:


&НаКлиенте
Процедура ОснованиеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Здесь мы будем вызывать свою логику выбора
    МассивТипов = Новый Массив;
    МассивТипов.Добавить(Тип("ДокументСсылка.ПриобретениеТоваровУслуг"));
    МассивТипов.Добавить(Тип("ДокументСсылка.ПриобретениеУслугПрочихАктивов"));
    
    // Вызываем меню выбора типа
    СписокТипов = Новый СписокЗначений;
    Для Каждого ТекущийТип Из МассивТипов Цикл
        СписокТипов.Добавить(ТекущийТип, Метаданные.НайтиПоТипу(ТекущийТип).Синоним);
    КонецЦикла;
    
    ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВыбораТипаОснования", ЭтотОбъект);
    ПоказатьВыборИзСписка(ОписаниеОповещения, СписокТипов, Элемент);
    
КонецПроцедуры

Как программно установить тип в поле составного типа

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

Выясним причину: реквизит с составным типом данных (например, Основание) должен содержать либо Неопределено, либо конкретную ссылку. Чтобы платформа поняла, какой справочник или журнал документов открывать при следующем клике, нам нужно записать в это поле пустую ссылку выбранного типа. Рассмотрим, как это реализовать в процедуре оповещения:


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

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

Реализация выбора через Динамический список

Если вам требуется сложный отбор (например, показывать документы только по определенному контрагенту или только те, по которым еще не выставлены счета-фактуры), стандартной формы выбора может быть недостаточно. В этом случае проанализируем подход с использованием Динамического списка.

Рассмотрим шаги для реализации:

Пример настройки отбора в динамическом списке программно:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Проведен");
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
    ЭлементОтбора.ПравоеЗначение = Истина;
    ЭлементОтбора.Использование = Истина;
    
КонецПроцедуры

Важные нюансы работы с определяемыми типами

В ERP 2.4 реквизиты оснований часто базируются на объекте ОпределяемыйТип.ОснованиеСчетФактураПолученный. Нужно помнить следующие моменты:

  1. Состав типа: Если вы программно пытаетесь подставить тип, который не входит в этот ОпределяемыйТип в метаданных, 1С очистит поле при записи документа. Проверьте, чтобы все нужные вам виды документов были включены в состав определяемого типа в конфигураторе.
  2. Проведение документа: Движения по регистрам НДС в ERP завязаны на типы оснований. Если вы добавляете свой тип документа в основания, убедитесь, что в модулях менеджера или в общих модулях учета НДС прописана логика обработки этого типа документа, иначе проведение счета-фактуры может не сформировать нужных записей в книге покупок.
  3. Вспомогательные формы: В счете-фактуре полученном список оснований часто редактируется не напрямую в основной форме, а в отдельном окне «Документы основания». Код по перехвату выбора нужно размещать именно в модуле этой вспомогательной формы.

Таким образом, мы разобрали, как полностью контролировать процесс выбора документа-основания. Использование СтандартнаяОбработка = Ложь в паре с Новый(Тип) дает разработчику гибкость, позволяя убрать лишние клики для пользователя и автоматизировать заполнение данных.

← На главную