Как автоматически создать и открыть нетиповой документ на основании типового в 1С:ERP, не снимая её с поддержки

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

При работе с крупными типовыми решениями, такими как 1С:ERP Управление предприятием или 1С:Комплексная автоматизация, часто возникает необходимость добавить специфический функционал. Одной из таких задач является автоматическое создание вспомогательного документа при проведении или записи основного. При этом критически важным условием остается сохранение типовой конфигурации на «замке» (на поддержке), чтобы не усложнять процесс последующих обновлений.

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

Анализ проблемы: почему подписки на события недостаточно?

Рассмотрим ситуацию, с которой сталкиваются многие начинающие разработчики. Традиционный путь автоматизации в 1С — это использование механизма Подписки на события. Вы можете создать подписку на событие ПриЗаписи или ОбработкаПроведения для типового документа. Однако здесь кроется главная архитектурная преграда: подписки на события выполняются на сервере.

На стороне сервера мы можем успешно создать объект нового документа, заполнить его данными и даже записать в базу данных. Но мы никак не можем «приказать» интерфейсу пользователя открыть форму этого документа. Команда ОткрытьФорму() доступна только в клиентском контексте, в то время как серверный код подписки ничего не знает об открытых окнах пользователя.

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

Решение задачи через расширение конфигурации

Для реализации этой задачи мы будем использовать Механизм расширений. Это позволяет нам не менять код основной конфигурации, но при этом внедряться в логику работы форм. Основная идея заключается в том, чтобы перехватить момент записи документа непосредственно в его форме на клиенте.

Разберем по шагам, как это реализовать:

  1. Создаем новое расширение и добавляем в него форму типового документа, который будет служить основанием.
  2. Находим в форме типового документа процедуру, отвечающую за запись (например, ПослеЗаписиНаСервере или клиентское событие завершения записи).
  3. Используем аннотацию &После (&After), чтобы дописать свой код, который сработает сразу после стандартных действий системы.

Рассмотрим пример кода в расширении для формы типового документа:


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

Механизм заполнения на основании

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

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


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, ТекстЗаполнения, СтандартнаяОбработка)
    
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ПриобретениеТоваровУслуг") Тогда
        // Заполняем реквизиты из документа-основания
        ЭтотОбъект.ДокументОснование = ДанныеЗаполнения;
        ЭтотОбъект.Организация = ДанныеЗаполнения.Организация;
        
        // Переносим табличную часть с пересчетом в доп. единицы
        Для Каждого СтрокаТЧ Из ДанныеЗаполнения.Товары Цикл
            НоваяСтрока = ЭтотОбъект.Товары.Добавить();
            ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаТЧ);
            // Здесь ваша специфическая логика пересчета
            НоваяСтрока.КоличествоДопЕИ = СтрокаТЧ.Количество * КоэффициентПересчета; 
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

Интеграция в структуру подчиненности

Одной из важных задач при создании документов на основании является их отображение в типовом отчете «Связанные документы» (структура подчиненности). В 1С:ERP этот отчет строится динамически. Чтобы ваш документ появился в этом списке, не внося изменений в типовой код, выполните следующие действия:

1. Использование определяемых типов: В конфигурации ERP есть определяемый тип ОснованиеСвязанныеДокументы (или аналогичный, в зависимости от версии). Вам нужно через расширение добавить ваш новый документ в состав этого определяемого типа. Это позволит системе «видеть» ваш документ как участника цепочек связей.

2. Реквизит связи: Убедитесь, что в вашем новом документе есть реквизит (например, ДокументОснование), который имеет тип ссылки на типовой документ и проиндексирован. Система поиска ссылок автоматически найдет эту связь.

Реализация учета дополнительных единиц измерения (ЕИ)

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

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

Выясним причины, по которым расширение может работать некорректно или «отвалиться» при обновлении. При использовании аннотаций &После или &Вместо для форм, вы привязываетесь к имени процедуры в типовой конфигурации. Если при обновлении фирмы «1С» название процедуры в форме документа изменится, расширение может потребовать адаптации.

Однако, создание нового документа в основной конфигурации (как сделал автор темы) — это более безопасный путь, чем создание его целиком внутри расширения. Если документ находится в основной конфигурации, данные в таблицах SQL физически принадлежат основной базе, и даже если расширение будет временно отключено, данные никуда не исчезнут.

Рассмотрим еще один полезный совет из практики: если вы хотите, чтобы форма открывалась не всегда, а только при определенных условиях (например, если в табличной части есть товары определенной категории), добавьте эту проверку в расширение формы перед вызовом ОткрытьФорму(). Это избавит пользователей от лишних пустых окон.

Итоги

Мы проанализировали ситуацию и нашли оптимальный способ автоматизации: использование клиентских событий формы в расширении. Этот метод позволяет обойти ограничения серверных подписок и обеспечить комфортную работу пользователя в интерфейсе. Сочетание нетипового документа в основной конфигурации и логики его вызова в расширении — это «золотой стандарт» доработки систем на поддержке, таких как 1С:ERP.

← На главную