Как создать документ Счет от поставщика на основании Счета покупателю в 1С:Бухгалтерия 3.0 без снятия с поддержки?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет IT и автоматизация бизнеса
← На главную

В практике автоматизации 1С часто возникает задача добавить возможность ввода одного типового документа на основании другого, если такая связь не предусмотрена разработчиками фирмы «1С». Одной из типичных задач в конфигурации Бухгалтерия предприятия 3.0 является создание документа Счет от поставщика на базе Счета на оплату покупателю. Это необходимо, например, в схемах перепродажи, когда менеджер выставляет счет клиенту, а затем на его основе формирует заказ (счет) поставщику.

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

Разберем проблему: почему просто добавить кнопку недостаточно?

Если мы просто добавим кнопку на форму через расширение, мы столкнемся с двумя проблемами. Во-первых, кнопка не будет находиться в стандартном подменю «Создать на основании», что нарушит единообразие интерфейса. Во-вторых, при нажатии на такую кнопку и создании документа связь между ними не зафиксируется в системе. Если вы откроете «Связанные документы», вы не увидите цепочку. Это происходит потому, что в типовом документе СчетОтПоставщика нет реквизита, хранящего ссылку на СчетНаОплатуПокупателю, и этот реквизит не включен в специальный объект метаданных — Критерий отбора.

Решение 1: Использование расширения для реализации полноценной связи

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

Шаг 1. Добавление реквизита и настройка связи

Для начала создадим расширение и добавим в него документ СчетОтПоставщика. Чтобы система «видела» связь, нам нужен «крючок» внутри целевого документа.

  1. Добавляем в документ СчетОтПоставщика (в расширении) новый реквизит, например, ДокументОснование_СчетПокупателю с типом ДокументСсылка.СчетНаОплатуПокупателю.
  2. Находим в расширении Критерий отбора СвязанныеДокументы.
  3. Переходим на вкладку «Состав» критерия отбора и отмечаем наш только что созданный реквизит. Именно это действие позволит документу отображаться в дереве связей.

Шаг 2. Программное заполнение данных

Теперь нам нужно научить новый счет «понимать» данные из старого. Для этого используем обработчик ОбработкаЗаполнения в модуле объекта документа СчетОтПоставщика. В расширении используем аннотацию &После.


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

Шаг 3. Регистрация в меню «Создать на основании»

В современных версиях БП 3.0 меню формируется динамически через БСП. Чтобы наш вариант появился в типовом списке, нужно обратиться к модулю менеджера документа-источника (СчетНаОплатуПокупателю).

В расширении для модуля менеджера перехватываем процедуру ПриОпределенииКомандПодключенныхКОбъекту. Выясним причину популярности этого метода: он позволяет добавлять команды без изменения форм самого документа.


&После("ПриОпределенииКомандПодключенныхКОбъекту")
Процедура Расш1_ПриОпределенииКомандПодключенныхКОбъекту(НастройкиРегистрации, ПараметрыРегистрации)
    
    Команда = НастройкиРегистрации.Команды.Добавить();
    Команда.Тип = "ЗаполнитьОбъект"; // Тип команды для ввода на основании
    Команда.Идентификатор = "СоздатьСчетОтПоставщикаНаОсновании";
    Команда.Представление = НСтр("ru = 'Счет от поставщика'");
    Команда.ПроверкаПроведенности = Истина;
    Команда.Порядок = 100;
    
    // Указываем целевой документ
    Команда.ИмяОбъекта = "Документ.СчетОтПоставщика";
    
КонецПроцедуры

Решение 2: Внешняя обработка (СозданиеСвязанныхОбъектов)

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

  1. Создаем внешнюю обработку с определенной структурой функции СведенияОВнешнейОбработке.
  2. Указываем вид обработки: СозданиеСвязанныхОбъектов.
  3. В процедуре ВыполнитьКоманду прописываем код открытия формы нового документа с заполнением.

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

Проанализируем особенности для Бухгалтерии предприятия

При реализации заполнения Счета от поставщика важно помнить о специфике учета:

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

← На главную