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