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