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

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

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

Анализ архитектурного подхода

Прежде чем приступать к написанию кода, важно осознать, что в типовой конфигурации Бухгалтерия предприятия 3.0 существует устоявшаяся логика работы: Счет на оплату — это документ-основание, который фиксирует первичные договоренности. Реализация товаров и услуг — это результат выполнения этих договоренностей.

Если мы начинаем автоматически перезаполнять счет при изменении реализации, мы сталкиваемся со следующими рисками:

  1. Нарушение юридической значимости: Счет мог быть оплачен клиентом по старым ценам или количеству. Автоматическое изменение данных в счете задним числом приведет к расхождениям в первичной документации.
  2. Бесконтрольное изменение: Автоматическое обновление при каждом проведении создает непредсказуемое поведение системы, которое сложно отследить пользователю.

Рекомендуемое решение: Использование кнопки для обновления

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

Разберем, как это реализовать с помощью Расширения конфигурации:

  1. Создайте новое расширение конфигурации.
  2. В расширении добавьте форму документа РеализацияТоваровУслуг.
  3. Разместите на форме новую кнопку «Обновить счет».
  4. В обработчике команды напишите алгоритм поиска и перезаполнения счета.

Алгоритм реализации через расширение

Рассмотрим пример кода, который позволит найти связанный счет и обновить его данные. Мы будем использовать поиск по структуре подчиненности для нахождения документа СчетНаОплатуПокупателю.


// В обработчике команды на клиенте
&НаКлиенте
Процедура ОбновитьСчет(Команда)
    РеализацияСсылка = Объект.Ссылка;
    ОбновитьСчетНаСервере(РеализацияСсылка);
КонецПроцедуры

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

Почему не стоит использовать проведение

Многие программисты пытаются использовать события ПередЗаписью или ПриЗаписи для автоматизации. Однако, работая в БП 3.0, важно помнить об особенностях объектной модели. Если вы планируете использовать расширение, помните, что точка останова в модуле менеджера объекта и точка останова в подписке на событие — это разные серверные вызовы.

Если вы все же решили использовать подписку на событие, убедитесь, что вы правильно настроили аннотацию в расширении:

  1. Добавьте подписку в расширение для события ПриЗаписи объекта РеализацияТоваровУслуг.
  2. Убедитесь, что логика записи счета не вызывает рекурсивного вызова события (зацикливания).
  3. Используйте метод ОбменДанными.Загрузка = Истина при записи счета, чтобы избежать случайного запуска проверок или движений, если это не требуется в момент программного обновления.

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

← На главную